Skip to main content
Glama
Harsh-Mer623

Mitti MCP Server

by Harsh-Mer623

Mitti MCP Server

A production-grade Model Context Protocol (MCP) server for Mitti (the 2026 rebrand of SafetyCulture — see the rebrand FAQ), built with FastMCP, Pydantic v2, and async httpx.

Expose your Mitti inspections, templates, actions, and users as MCP tools for any LLM client (Claude Desktop, Claude Code, Cursor, Gemini CLI, and more).

Migrated from SafetyCulture to Mitti. api.safetyculture.io still works with no announced shutoff date, but api.mitti.com is the long-term host and is now the default. Legacy SAFETYCULTURE_API_TOKEN/SAFETYCULTURE_BASE_URL env vars still work as a fallback. See API limitations below — several endpoints changed shape, not just host, in the rebrand.


Features

Domain

Tools Available

Inspections

List (lightweight), get (full detail), complete, web report link, visual table view

Templates

List (lightweight), get (full detail), get definition

Actions

List, get, create, update status, update title

Users

List, search (client-side filtered)


Related MCP server: Sentinel Core Agent

API limitations (read this before relying on a field)

The Mitti API is not a drop-in rename of the old SafetyCulture API — verified against developer.mitti.com/reference:

  • list_inspections only returns audit_id, template_id, and date_modified — the search endpoint's field parameter doesn't support name/owner/score/status. Call get_inspection with a specific audit_id for full detail.

  • list_templates similarly only returns template_id, name, and dates. Call get_template for description/owner/archived status.

  • Action priority is now an org-specific priority_id (UUID from your org's task-type configuration), not a fixed low/medium/high string. create_action accepts an optional priority_id — omit it for the system default.

  • Action status IS still a fixed, documented set for the built-in Actions type, so update_action_status and list_actions's status filter keep the friendly open/in_progress/completed/cant_do interface — translated under the hood to Mitti's stable status UUIDs. list_actions filters status and priority_id server-side (via the API's task_filters), not by fetching everything and filtering in Python.

  • get_current_user is unsupported. Mitti's current API has no "current authenticated user" / "me" endpoint at all. The tool returns a clear failure explaining this — use search_users with a known email instead.

  • User status and role are proto enums on the wire (e.g. USER_ACTIVE_STATUS_ACTIVE, SUBSCRIPTION_SEAT_TYPE_PREMIUM) — list_users's status filter accepts the friendly active/inactive (there is no pending status), and UserSummary.status/.role are translated back to short lowercase labels rather than leaking the raw wire values.

  • search_users does client-side substring filtering, because the replacement for the deprecated email-only search endpoint (/users/v1/users/list) only supports exact-match filters, not free text.


Requirements


Setup

1. Clone & install

git clone <your-repo>
cd mitti-mcp

uv venv --python 3.12
# Windows:
.venv\Scripts\activate
# macOS/Linux:
source .venv/bin/activate

uv add "fastmcp[apps]" httpx pydantic python-dotenv

2. Configure your API token

cp .env.example .env
# Edit .env and set MITTI_API_TOKEN=your_token_here

To generate a Mitti API token:

  1. Log into Mitti → Account SettingsAPI Tokens

  2. Click Generate Token and copy the value.

3. Run and test the server locally

Option A: Interactive Inspector UI (Development Mode)

FastMCP includes a browser-based developer inspector interface. Run the command:

fastmcp dev inspector src/mitti_mcp/server.py

This starts your server and prints a link containing an authentication token (e.g., http://localhost:6274/?MCP_PROXY_AUTH_TOKEN=...). Open this link in your browser to test each tool.

Alternatively, you can run the inspector without authentication:

# Windows PowerShell
$env:DANGEROUSLY_OMIT_AUTH="true"; fastmcp dev inspector src/mitti_mcp/server.py

# macOS/Linux/Git Bash
DANGEROUSLY_OMIT_AUTH=true fastmcp dev inspector src/mitti_mcp/server.py

Option B: Inspect definitions via CLI

Check the tool schemas and registered components directly on the command line:

fastmcp inspect src/mitti_mcp/server.py

Option C: Call tools from the CLI

You can query and execute specific tools directly from the terminal:

# List all tools and parameters
fastmcp list src/mitti_mcp/server.py

# Execute a tool with parameters
fastmcp call src/mitti_mcp/server.py list_users limit=5

Option D: Run directly via Python

To run the server directly (using stdio transport):

uv run python -m mitti_mcp.server

Claude Desktop Configuration

Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "mitti": {
      "command": "uv",
      "args": [
        "--directory",
        "/absolute/path/to/mitti-mcp",
        "run",
        "python",
        "-m",
        "mitti_mcp.server"
      ],
      "env": {
        "MITTI_API_TOKEN": "your_token_here"
      }
    }
  }
}

Connecting to the remote (Render) deployment via HTTP

For a client that supports remote "type": "http" MCP servers directly (no stdio bridge needed), point it at the deployed URL and pass your Mitti API token as a custom header — not Authorization, since FastMCP's HTTP layer reserves that header for its own auth and strips it before it reaches tool code:

{
  "mcpServers": {
    "mitti": {
      "type": "http",
      "url": "https://mitti-mcp.onrender.com/mcp",
      "headers": {
        "x-mitti-token": "your_token_here"
      }
    }
  }
}

client.py checks the incoming request's x-mitti-token header first, falling back to the server's own MITTI_API_TOKEN env var if the header is absent. This means:

  • One shared deployment can serve multiple callers/orgs, each with their own token, with no server-wide token configured on Render at all.

  • Or, keep MITTI_API_TOKEN set in Render's dashboard as before, and the header becomes optional — useful while testing, since you don't have to configure it in every client.

To make the header mandatory (no shared fallback), remove MITTI_API_TOKEN from Render's environment variables — then any request without a valid x-mitti-token header fails clearly instead of silently using a shared token.


Deployment (Prefect Horizon)

To deploy your server live to the cloud:

  1. Push your repository to GitHub (public or private).

  2. Sign in to horizon.prefect.io.

  3. Connect your GitHub account and select your repository.

  4. Configure your deployment:

    • Server name: A unique name for your server (this determines your server's endpoint URL).

    • Entrypoint: src/mitti_mcp/server.py:mcp

    • Authentication: Enable to secure your server endpoints with OAuth.

  5. Click Deploy Server to build and launch your live production endpoint.


Deployment (Render)

A Render Blueprint is included (render.yaml) that runs the server over streamable-HTTP instead of stdio:

  1. Push this repo to GitHub.

  2. On render.com, click New +Blueprint and select this repo.

  3. Render reads render.yaml automatically. When prompted, set the MITTI_API_TOKEN environment variable (it's intentionally left blank in the blueprint — never commit a real token).

  4. Deploy. The MCP endpoint is served at https://<your-service>.onrender.com/mcp (not /) — point streamable-HTTP MCP clients at that path.

Not yet verified against a live Render deploy: Render's default health check hits /, which this server doesn't serve (only /mcp). If the service is marked unhealthy despite running fine, set healthCheckPath: /mcp in render.yaml or add a trivial health route.


Project Structure

mitti-mcp/
├── README.md
├── pyproject.toml
├── render.yaml
├── .env.example
└── src/
    └── mitti_mcp/
        ├── __init__.py
        ├── server.py            # FastMCP app entry point
        ├── client.py            # httpx Mitti API client
        ├── tools/
        │   ├── inspections.py   # Inspection tools
        │   ├── actions.py       # Action tools
        │   ├── templates.py     # Template tools
        │   └── users.py         # User tools
        └── models/
            └── schemas.py       # Pydantic v2 models

Tech Stack

Layer

Tool

MCP framework

FastMCP 4.x

HTTP client

httpx (async)

Validation

Pydantic v2

Python

3.12+

Package manager

uv


Middleware

The server applies cross-cutting middleware (src/mitti_mcp/server.py) to every tool call across all mounted sub-servers, in this order:

  1. ErrorHandlingMiddleware — catches and logs unhandled exceptions consistently.

  2. LoggingMiddleware — logs every request/response with duration and payload size.

  3. RateLimitingMiddleware — global token-bucket limit (default 10 req/s, override with MITTI_MCP_RATE_LIMIT_RPS) to protect the Mitti API from bursts.


Human-in-the-Loop Approval (Prefab UI)

Requires fastmcp[apps] (already in pyproject.toml). The server registers FastMCP's Approval provider, which exposes a request_approval tool. The server instructions and the descriptions of all write tools (complete_inspection, create_action, update_action_status, update_action_title) tell the LLM to call request_approval and wait for the user's decision before performing the write.

The user sees an Approve/Reject card rendered inline in the conversation (an MCP Apps UI component, not plain text). Clicking a button sends "<summary>" — I selected: Approve/Reject back into the conversation as if the user typed it.

This is an advisory gate, not server-side enforcement — it relies on the LLM following the instructions. It does not replace the input validation and error handling already in client.py and the tool modules.

Try it: fastmcp call src/mitti_mcp/server.py request_approval summary="..."

Visual inspection browsing

list_inspections_view (app=True) returns the same data as list_inspections but as an interactive, sortable, searchable DataTable rendered inline in the conversation instead of raw JSON. The LLM picks this tool over list_inspections when the user wants to browse/sort/search visually.


License

MIT

Available Tools

17 tools
actions_create_actionActions Create ActionA

Create a new action in Mitti. Requires at minimum a title. Optionally set description, due date (ISO 8601), assignee user IDs, and site ID. priority_id is an org-specific UUID — omit it for the system default priority. Call request_approval first and wait for the user's decision before calling this tool. Returns the created action's ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesAction title (required).
due_atNoDue date/time in ISO 8601 format, e.g. '2024-12-31T17:00:00.000Z'.
site_idNoSite ID to associate with this action.
descriptionNoDetailed description of what needs to be done.
priority_idNoOrg-specific priority ID (UUID). Omit for the system default.
assignee_idsNoList of user IDs to assign this action to.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
titleYes
due_atNo

TDQS

A4.1/5.0
Behavior3/5

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

With no annotations, the description carries the behavioral disclosure burden. It does reveal key behavior: it creates a new action, requires prior approval, and returns the created action's ID. However, it does not mention side effects, reversibility, permission requirements, or what happens if approval was not obtained, so the transparency is incomplete.

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

Conciseness4/5

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

The description is compact and front-loaded, with the core purpose first followed by requirements, optional fields, and workflow guidance. Each sentence adds useful information, though it is slightly longer than necessary due to the list of optional parameters.

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

Completeness4/5

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

Given the tool's moderate complexity and the presence of an output schema, the description covers the essentials: required vs optional fields, the important priority_id default behavior, the approval workflow, and the return value. It is sufficient for an agent to call correctly, though it could mention which sibling tool to use for retrieving the created action afterward.

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 coverage is 100%, so the baseline is 3, but the description adds meaningful semantic guidance beyond the schema. It clarifies that priority_id is an org-specific UUID and that omitting it uses the system default, and it reinforces that only title is required.

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 description opens with 'Create a new action in Mitti,' naming a specific verb, resource, and system. This clearly separates it from siblings like actions_update_action_status and actions_get_action, which operate on existing actions.

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

Usage Guidelines4/5

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

It provides explicit sequencing: 'Call request_approval first and wait for the user's decision before calling this tool,' which tells the agent when it is appropriate to invoke this tool. It also states the minimum requirement of a title, giving clear entry conditions, though it does not describe when not to use the tool beyond the approval prerequisite.

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

actions_get_actionActions Get ActionA

Get full details of a specific Mitti action by its ID. Returns title, description, status, priority_id, due date, assignees, and site.

ParametersJSON Schema
NameRequiredDescriptionDefault
action_idYesThe unique action ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesUnique action identifier
titleYesAction title
due_atNoDue date/time
statusNoAction status: 'open', 'in_progress', 'completed', 'cant_do'
site_idNoSite this action belongs to
assigneesNoList of assignee user IDs
created_atNoWhen the action was created
descriptionNoDetailed description
modified_atNoLast modification timestamp
priority_idNoOrg-specific priority identifier (Mitti's task-type system uses UUIDs, not fixed 'low'/'medium'/'high' labels — this field is not human-readable)
creator_user_idNoUser ID who created the action

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden. 'Get' implies a read-only operation and the returned fields are listed, but there is no explicit statement about not-found behavior, authentication needs, or side effects. It adds some context but leaves behavioral gaps.

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

Conciseness5/5

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

Two focused sentences with no filler. The core purpose is front-loaded, and the field list earns its place by setting expectations about what 'full details' means.

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

Completeness4/5

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

For a simple single-parameter get operation with an output schema available, the description plus schema is nearly complete. It could mention error handling or authorization, but nothing essential is missing for correct invocation.

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

Parameters3/5

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

The input schema covers 100% of parameters and already describes action_id as 'The unique action ID.' The description only reinforces 'by its ID' without adding format, source, or usage nuances, so baseline 3 is appropriate.

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?

States a specific verb ('Get'), a specific resource ('full details of a specific Mitti action by its ID'), and lists the returned fields. This clearly distinguishes it from sibling actions_list_actions, which lists actions rather than retrieving one.

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

Usage Guidelines4/5

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

The phrase 'by its ID' makes the usage context clear: call this when you already have an action_id and need full details for that single action. It does not explicitly name alternatives or exclusions, but the intended trigger is obvious.

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

actions_list_actionsActions List ActionsA

List actions from the Mitti (formerly SafetyCulture) account. Supports server-side filtering by status (open, in_progress, completed, cant_do) and by an org-specific priority_id (UUID). Returns action ID, title, description, status, priority_id, due date, and assignees.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of actions to return (1–100, default 20).
statusNoFilter by status. One of: 'open', 'in_progress', 'completed', 'cant_do'.
priority_idNoFilter by a specific org-specific priority ID (UUID).

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalNo
actionsNo
next_page_tokenNo

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the behavioral burden. It adds value by disclosing server-side filtering and enumerating returned fields, and read-only behavior is implied by 'List.' However, it does not mention pagination, ordering, or any limits beyond the schema's existing limit parameter.

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

Conciseness5/5

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

The description is two concise sentences with no filler. It front-loads the core purpose and account context, then efficiently covers filtering and return fields. Every sentence earns its place.

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

Completeness4/5

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

For a low-complexity read-only list tool with an output schema and fully documented optional parameters, the description is largely complete. It provides return fields and filter semantics, though it omits pagination and ordering behavior; these are minor gaps given the output schema and simple parameter set.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents status and priority_id, including allowed status values and the UUID type. The description mostly restates this information rather than adding new semantic meaning, though it does clarify that filtering is applied server-side.

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 description opens with a specific verb and resource: 'List actions from the Mitti (formerly SafetyCulture) account.' It clearly differentiates this tool from siblings like actions_get_action (single action), actions_create_action, and actions_update_action_status by focusing on listing and filtering.

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

Usage Guidelines4/5

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

The description makes the use case clear: listing actions with optional server-side filtering by status or priority_id. It does not explicitly name alternatives or state when not to use this tool, but the listing/filtering context is unambiguous among the sibling set.

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

actions_update_action_statusActions Update Action StatusA

Update the status of a Mitti action. Valid statuses are: 'open', 'in_progress', 'completed', 'cant_do'. Call request_approval first and wait for the user's decision before calling this tool. Returns success or an error message.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusYesNew status — one of: 'open', 'in_progress', 'completed', 'cant_do'.
action_idYesThe unique action ID to update.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
messageYes
successYes

TDQS

A4.2/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden. It discloses the valid statuses and the required approval precondition, and states the return is success or an error message. However, it does not mention whether the update is idempotent, whether it overwrites existing status, or any permission requirements. The approval precondition is valuable behavioral context, but the description could go further.

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

Conciseness5/5

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

Three sentences, each earning its place: what the tool does, valid values, and the critical precondition. The most important usage constraint is front-loaded after the purpose statement. No wasted words.

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

Completeness4/5

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

For a simple two-parameter mutation with an output schema, the description covers the essential workflow (approval first) and the valid inputs. It lacks details on edge cases like whether status transitions are restricted, but the output schema and simple parameter set keep the gap small.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents both parameters. The description adds the valid status values, which are also in the schema's status description, so it adds little beyond the schema. Baseline 3 is appropriate.

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 description states a specific verb ('Update'), a specific resource ('status of a Mitti action'), and enumerates the valid status values. This clearly distinguishes it from sibling tools like actions_update_action_title and actions_create_action.

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 instructs to call request_approval first and wait for the user's decision before using this tool. This is a clear when-to-use directive that prevents misuse and distinguishes it from the approval workflow.

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

actions_update_action_titleActions Update Action TitleA

Update the title of a Mitti action. Call request_approval first and wait for the user's decision before calling this tool. Returns success or an error message.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesNew title for the action (max 255 characters).
action_idYesThe unique action ID to update.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
messageYes
successYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden. It discloses the mandatory approval gate and states the return behavior ('Returns success or an error message'), which is more than a bare mutation statement. It could add details like irreversibility or permission requirements, but the most important behavioral trait is covered.

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

Conciseness5/5

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

Two short sentences, no filler, and the most actionable guidance (approval ordering) is included with a direct command. Every sentence earns its place.

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?

For a simple two-parameter update with a full input schema and an output schema present, the description covers purpose, workflow placement, and result. An agent has enough information to select and invoke the tool correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already fully documents both title and action_id. The description adds only that the action is a 'Mitti action,' which is useful context but does not change how parameters should be filled.

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 description uses a specific verb and object: 'Update the title of a Mitti action.' This clearly distinguishes the tool from sibling actions_update_action_status and the many inspection/template tools, so an agent knows exactly what resource is affected.

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 gives an explicit sequential precondition: call request_approval first, wait for the user's decision, then call this tool. This names the relevant sibling and tells the agent precisely when in the workflow this tool is valid.

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

inspections_complete_inspectionInspections Complete InspectionA

Mark a Mitti inspection as complete. This is a write operation — the inspection must be in 'in_progress' status. Call request_approval first and wait for the user's decision before calling this tool. Returns success or an error message.

ParametersJSON Schema
NameRequiredDescriptionDefault
audit_idYesThe unique audit/inspection ID to complete.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
messageYes
successYes

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations provided, the description fully carries the burden of behavioral disclosure. It clearly states this is a write operation, describes the prerequisite status and sequencing, and mentions the return behavior ('Returns success or an error message'). This is comprehensive for a simple state-transition tool.

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

Conciseness5/5

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

The description is three sentences total, with the primary action first, followed by critical preconditions and return behavior. Every sentence adds necessary information with no redundancy or padding.

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?

Given a single required parameter, a high-coverage schema, an output schema, and no annotations, the description covers all essential operational context: what it does, when to call it, what to do before it, and what to expect as a return. Nothing critical is missing.

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

Parameters3/5

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

Schema description coverage is 100% and the audit_id parameter is already described as 'The unique audit/inspection ID to complete.' The description does not add much beyond this, aside from reinforcing that the parameter is an inspection ID tied to the completion operation. Baseline 3 applies because the schema handles the parameter documentation.

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 description states a specific action and resource: 'Mark a Mitti inspection as complete.' It clearly differentiates from sibling tools like inspections_list_inspections and request_approval by identifying the completion action and its write nature.

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 provides usage conditions: the inspection 'must be in in_progress status' and the tool should be called only after request_approval and waiting for the user's decision. This gives clear procedural guidance and prevents misuse.

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

inspections_get_inspectionInspections Get InspectionA

Get full details of a single Mitti inspection by its audit ID. Returns name, template, owner, dates, score, and status.

ParametersJSON Schema
NameRequiredDescriptionDefault
audit_idYesThe unique audit/inspection ID (starts with 'audit_').

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYes
scoreNo
statusNo
site_idNo
audit_idYes
owner_nameNo
template_idNo
total_scoreNo
date_startedNo
date_modifiedNo
date_completedNo

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden of behavioral disclosure. It states what the tool returns (name, template, owner, dates, score, status) but doesn't disclose whether this is a read-only operation, whether it can fail (e.g., not found), or any rate limits. Since it's a 'get' operation, the read-only nature is implied but not explicitly stated. The description adds some value by listing return fields, but lacks deeper behavioral context.

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

Conciseness5/5

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

The description is a single, concise sentence that front-loads the core purpose and lists the key return fields. Every word earns its place, and there is no redundancy or fluff.

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

Completeness4/5

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

For a simple single-parameter get tool with an output schema, the description is largely complete. It identifies the resource, the identifier, and the key fields returned. It doesn't mention error cases (e.g., invalid audit_id) or explicitly state read-only behavior, but these are minor gaps given the tool's simplicity and the presence of an output schema.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents the audit_id parameter well, including its format ('starts with audit_'). The description adds the context that this is the audit/inspection ID, but doesn't add significant meaning beyond the schema. Baseline 3 is appropriate since the schema does the heavy lifting.

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 description clearly states the tool's purpose: 'Get full details of a single Mitti inspection by its audit ID.' It specifies the resource (inspection), the action (get full details), and the identifier (audit ID). It also lists the key fields returned (name, template, owner, dates, score, status), which distinguishes it from sibling tools like inspections_list_inspections and inspections_get_inspection_web_report_link.

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

Usage Guidelines4/5

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

The description implies usage: use this tool when you need full details of a single inspection by audit ID. It doesn't explicitly state when not to use it or name alternatives, but the context signals and sibling names (e.g., inspections_list_inspections for listing, inspections_get_inspection_web_report_link for web report link) make the usage context clear. A clear exclusion or alternative mention would push this to 5.

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

inspections_list_inspectionsInspections List InspectionsA

List inspections from the Mitti (formerly SafetyCulture) account. Supports filtering by modification date and limiting the number of results. Returns only audit_id, template_id, and modification date per inspection — the search API does not return name, owner, score, or status. Call get_inspection with a specific audit_id for full details.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of inspections to return (1–100, default 20).
template_idNoFilter by a specific template ID.
modified_afterNoISO 8601 timestamp — only return inspections modified after this time. Example: '2024-01-01T00:00:00.000Z'

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalNoTotal number of matching inspections (may exceed page size)
inspectionsNo
next_page_tokenNoCursor for the next page of results

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the burden of disclosure. It clearly states a key behavioral trait: only audit_id, template_id, and modification date are returned, and the search API does not return name, owner, score, or status. It implies read-only behavior by saying 'list', although it does not cover rate limits or authentication detail.

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

Conciseness5/5

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

The description is three sentences, each serving a distinct purpose: statement of purpose, supportable capabilities, and a field limitation with an alternative call. There is no fillable extra text or irrelevant detail; every sentence is front-loaded and adds value.

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

Completeness4/5

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

The presence of an output schema means return values do not need full explanation; the description still covers the critical limitations and directs the agent to a richer tool. It does not mention the sibling 'inspections_list_inspections_view', which could cause mild ambiguity, but the overall context is sufficient for guided use.

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

Parameters3/5

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

The input schema covers all three parameters with 100% description coverage, so the schema already explains limit, template_id, and modified_after. The description repeats the 'modification date' and 'limiting' concepts but adds no new parameter-level semantics beyond what the schema provides.

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 description states the specific verb and resource ('List inspections from the Mitti account') and explicitly differentiates this tool from get_inspection by saying 'Call get_inspection with a specific audit_id for full details.' It also communicates the limited field set, which helps distinguish it from a fuller inspection tool.

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?

It explicitly tells the agent when to use get_inspection instead ('Call get_inspection with a specific audit_id for full details'), serving as a clear alternative. It also describes the general filtering and limiting capabilities, giving a sense of when the tool is appropriate.

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

inspections_list_inspections_viewInspections List Inspections ViewA

Show inspections from the Mitti account as an interactive, sortable, searchable table rendered directly in the conversation. Use this instead of list_inspections when the user wants to browse inspections visually. Only shows audit_id, template_id, and modification date — the same limitation as list_inspections.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of inspections to return (1–100, default 20).
template_idNoFilter by a specific template ID.
modified_afterNoISO 8601 timestamp — only return inspections modified after this time.

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations provided, the description carries the burden of behavioral disclosure. It adds meaningful behavior context: the result is an interactive, sortable, searchable table rendered in conversation, and it only exposes audit_id, template_id, and modification date. This goes beyond a generic list operation and informs the agent about constraints, though it stops short of discussing pagination or precise interaction mechanics.

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

Conciseness5/5

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

Three sentences with no fluff: the first states the core action, the second gives a direct usage warning, and the third discloses the output limitation. Each sentence adds unique value and key information is front-loaded.

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

Completeness4/5

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

For a read-only listing tool with three optional, fully documented parameters, the description covers the tool's purpose, visual output, and column limitations. It does not provide an output schema but compensates by describing the rendered table. Slightly more detail about pagination defaults or sorting behavior could make it fully complete, but the description is adequate for correct invocation.

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

Parameters3/5

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

Schema description coverage is 100%; the input schema already fully documents limit, template_id, and modified_after with types, defaults, and descriptions. The tool description adds no additional parameter-level meaning, so the baseline 3 for high schema coverage applies.

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 description clearly identifies a specific verb (show), resource (inspections from the Mitti account), and delivery mode (interactive, sortable, searchable table rendered in conversation). It also explicitly differentiates from list_inspections by the visual browsing use case, making the tool's unique purpose unmistakable.

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 states when to use this tool: 'Use this instead of list_inspections when the user wants to browse inspections visually.' This gives the agent a clear routing rule and names the alternative, satisfying the when/alternative requirement.

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

request_approvalRequest ApprovalA

Request human approval before proceeding with an action.

Call this tool proactively whenever you are about to take a significant or irreversible action and want the user to confirm first. Do NOT wait for the user to ask you to seek approval — use your judgment about when confirmation is appropriate.

The user will see an approval card with the summary, optional details, and Approve/Reject buttons. When they click a button, their decision appears as a message in the conversation (as if the user typed it), like:

"Deploy v3.2 to production" — I selected: Approve

or:

"Deploy v3.2 to production" — I selected: Reject

IMPORTANT: After calling this tool, you MUST stop and wait for the user's response. Do not continue, do not take any other actions, do not generate further output until you see the "I selected:" message. If approved, continue with the action. If rejected, acknowledge and ask how to proceed.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoHeading for the approval card (default: "Approval Required").
detailsNoOptional longer explanation, context, or consequences of the action.
summaryYesBrief description of the action requiring approval (shown prominently to the user).
reject_textNoLabel for the reject button (default: "Reject").
approve_textNoLabel for the approve button (default: "Approve").
reject_variantNoButton style for the reject button (same options plus "outline").
approve_variantNoButton style — "default", "destructive", "success", or "info".

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations present, the description carries the full behavioral burden and handles it admirably. It explains that the user sees an approval card, that the decision appears as a conversation message in a specific format, and that the agent must halt until that message arrives. This gives the agent an accurate mental model of the tool's asynchronous interaction pattern.

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

Conciseness5/5

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

The description is longer than average but every sentence earns its place: purpose, proactive usage, card behavior, response format, and required post-call behavior. The structure is front-loaded and logically ordered, making it easy for an agent to extract the key rules.

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?

For an interactive approval tool with no annotations and no output schema, the description is remarkably complete. It covers the UI presentation, the user response mechanism, the mandatory stop-and-wait behavior, and the appropriate actions after approval or rejection. No critical behavioral context appears to be missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents each parameter. The description does not add meaningful parameter-level detail beyond mentioning the summary and optional details, and it does not clarify the button variant parameters. This matches the baseline score for a fully documented schema.

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 description opens with a specific verb and resource: 'Request human approval before proceeding with an action.' This clearly distinguishes the tool from the unrelated inspection, template, action, and user siblings. There is no ambiguity about what the tool accomplishes.

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 gives explicit when-to-use guidance: call proactively before significant or irreversible actions, and do not wait for the user to request approval. It also tells the agent to stop after calling and wait for the user's decision, with clear instructions for both approved and rejected outcomes.

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

templates_get_templateTemplates Get TemplateA

Get summary metadata for a specific Mitti template by its ID. Returns name, description, owner, archived status, and dates.

ParametersJSON Schema
NameRequiredDescriptionDefault
template_idYesThe unique template ID (starts with 'template_').

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYesTemplate name
archivedNoWhether this template is archived
created_atNoCreation timestamp
owner_nameNoTemplate owner display name
descriptionNoTemplate description
modified_atNoLast modification timestamp
template_idYesUnique template identifier

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden. It discloses that only summary metadata is returned and names the exact fields. The read-only nature is implied by 'Get summary metadata', though not explicitly stated.

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

Conciseness5/5

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

Two tight sentences: the first states purpose and scope, the second lists return fields. No filler or redundant restatement of the name.

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?

For a single-parameter get-by-ID operation with an output schema, the description covers purpose, selection, and return contents. No additional context is needed for correct invocation.

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

Parameters3/5

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

Schema coverage is 100% and the schema already documents template_id, including the 'template_' prefix. The description only adds 'by its ID', which does not materially enrich parameter semantics beyond the baseline.

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 description uses a specific verb ('Get'), a clear resource ('summary metadata for a specific Mitti template'), and a selection criterion ('by its ID'). It also enumerates the returned fields, making it distinguishable from list and definition siblings.

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

Usage Guidelines3/5

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

The description implies the tool is for retrieving one known template's summary metadata, but it does not explicitly state when to use this over templates_list_templates or templates_get_template_definition. There is no when-not or alternative guidance.

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

templates_get_template_definitionTemplates Get Template DefinitionC

Get the full definition of a Mitti template including all questions, sections, and scoring rules. Returns a structured summary of the template definition.

ParametersJSON Schema
NameRequiredDescriptionDefault
template_idYesThe unique template ID (starts with 'template_').

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
messageYes
successYes

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description must carry the burden of behavioral disclosure. It only says the tool 'returns a structured summary,' which is vague and somewhat inconsistent with the earlier claim of returning the 'full definition.' It does not clarify permissions, errors, or what happens when the template_id is invalid.

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

Conciseness4/5

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

The description is short and front-loaded with the core action in the first sentence. However, the second sentence repeats the idea of returning the template definition and uses the vague phrase 'structured summary,' so it does not fully earn its place as distinct, valuable information.

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

Completeness3/5

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

For a one-parameter getter with an output schema available, the core invocation details are sufficient and the return format can be inferred from the schema. However, the ambiguity between 'full definition' and 'structured summary,' plus the lack of distinction from templates_get_template, leaves the agent with incomplete context for confident tool selection.

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

Parameters3/5

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

Schema description coverage is 100%, so the single parameter template_id is already fully documented with its type and prefix convention. The description adds no parameter-level detail, so the baseline score of 3 is appropriate given the schema does the heavy lifting.

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

Purpose4/5

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

The description uses a specific verb ('Get') and names the resource ('full definition of a Mitti template'), enumerating contents such as questions, sections, and scoring rules. It is clear about what the tool does, but it does not differentiate itself from the sibling tool templates_get_template, which may look very similar to an agent.

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

Usage Guidelines2/5

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

There is no guidance about when to use this tool versus alternatives. The near-identical sibling templates_get_template is not mentioned or contrasted, leaving the agent to guess which retrieval tool fits the need. The only usage signal is the implied 'full definition' wording, which is not explicit enough.

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

templates_list_templatesTemplates List TemplatesA

List templates available in the Mitti (formerly SafetyCulture) account. Returns template ID, name, and dates only — description, owner, and archived status require get_template. Use the returned template_id to get the full template definition.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of templates to return (1–100, default 20).
archivedNoIf True, include archived templates. Default is False (active only).

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalNo
templatesNo
next_page_tokenNo

TDQS

A4.4/5.0
Behavior4/5

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

No annotations are provided, so the description carries the behavioral disclosure burden. It clearly communicates the tool's limited return shape (ID, name, dates only) and directs the agent to get_template for omitted fields. It does not mention rate limits or auth, but for a simple read-only list with an output schema, this is strong behavioral context.

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

Conciseness5/5

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

The description is two sentences with no filler. The core action and return scope are front-loaded, and the pointer to get_template earns its place as actionable guidance.

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

Completeness4/5

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

Given the tool's simplicity, an existing output schema, and two optional parameters fully documented in the schema, the description is nearly complete. It clarifies the returned data subset and the next step. Minor gaps are that it does not explicitly address pagination and does not disambiguate between templates_get_template and templates_get_template_definition.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already fully documents limit and archived. The description adds no additional parameter-specific meaning beyond the schema, so it meets the baseline but does not exceed it.

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 description opens with a specific verb and resource: 'List templates available in the Mitti account.' It further distinguishes itself from get_template by stating exactly what fields are returned (ID, name, dates) and what is omitted, so an agent can confidently differentiate it from sibling tools.

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 states when to use the full-detail sibling: 'description, owner, and archived status require get_template,' and instructs the agent to use the returned template_id to get the full definition. This provides clear when-to-use and when-not-to-use guidance.

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

users_get_current_userUsers Get Current UserA

Get the profile of the currently authenticated Mitti user. NOTE: Mitti's current API has no dedicated 'current user' endpoint — this always returns failure with guidance to use search_users with a known email instead.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
messageYes
successYes

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations to fall back on, the description carries the full burden of behavioral disclosure. It does this excellently by stating that the tool always returns failure and includes guidance toward a working alternative, preventing false expectations.

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

Conciseness5/5

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

The description is two sentences, front-loads the nominal purpose, and immediately adds the critical caveat. There is no wasted verbiage, and the most important behavioral fact is prominent.

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?

Given zero parameters, presence of an output schema, and the explicit failure-plus-alternative behavior, the agent has everything it needs to decide not to call the tool and to use users_search_users instead. Nothing essential 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?

The tool has zero parameters, so schema coverage is trivially 100%. The description has no input semantics to add; the baseline of 4 for a zero-parameter tool is appropriate.

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 description states the intended operation — get the profile of the currently authenticated Mitti user — and immediately contrasts it with the actual behavior: the endpoint does not exist and always returns failure. This clearly distinguishes it from sibling tools like users_search_users and users_list_users.

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?

It goes beyond vague context by explicitly telling the agent that this tool always fails and that the alternative, search_users with a known email, should be used instead. This is a direct when-to-use/when-not-to-use statement.

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

users_list_usersUsers List UsersA

List users in the Mitti (formerly SafetyCulture) organization. Returns user ID, first name, last name, email, status ('active' or 'inactive' — there is no 'pending' status), and a best-effort role indicator. Useful for finding user IDs to assign to actions.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of users to return (1–200, default 20).
statusNoFilter by account status — 'active' or 'inactive'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalNo
usersNo
next_page_tokenNo

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the burden of disclosing behavior. It warns that status is only 'active' or 'inactive' with no 'pending' status, and notes the role indicator is 'best-effort', providing important caveats about data accuracy. It does not mention pagination, but the schema covers limit.

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

Conciseness5/5

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

The description is a focused three-sentence structure: action, deliverables, and a practical use-case. There is no padding, and the most important fact is front-loaded.

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

Completeness4/5

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

For a straightforward list endpoint with an output schema and two parameters, this description covers the essentials: what it returns, the status semantics, and why an agent would call it. It could mention pagination behavior, but the schema's limit and the simple nature of the tool make the gap minor.

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?

Given 100% schema coverage, a score of 3 is the baseline. The description adds meaningful nuance by explicitly defining the only possible statuses and calling out that 'pending' does no, which helps agents interpret both the status filter and the returned data.

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

Purpose4/5

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

The description clearly states it lists users in the Mitti organization and lists the returned fields, making the tool's action and scope specific. It does not explicitly distinguish itself from the sibling users_search_users, so it's strong but not a full 5.

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

Usage Guidelines3/5

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

It offers an implied use case ('Useful for finding user IDs to assign to actions'), but there is no explicit when-to-use guidance or comparison with alternatives such as users_search_users. The agent must infer the selection from the name and statement.

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

users_search_usersUsers Search UsersA

Search for Mitti users by name or email substring. NOTE: the underlying API only supports exact-match filters, so this fetches all users and filters client-side — it is not efficient for very large organizations. Returns matching users with their IDs, names, emails, and statuses.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results to return (default 10, max 100).
queryYesSearch string to match against user names and email addresses.

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalNo
usersNo
next_page_tokenNo

TDQS

A4.2/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and discloses a significant non-obvious behavior: the API only supports exact-match filters, so the tool downloads all users and filters locally. It also states the returned fields, giving the agent a clear picture of side effects and cost.

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

Conciseness5/5

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

Three focused sentences front-load the purpose, add a crucial efficiency caveat, and state return contents. No filler words; every sentence earns its place.

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?

Given the two-parameter schema with full descriptions, an output schema, and the behavioral disclosure in the description, an agent has all the information needed to invoke this tool correctly. The efficiency warning is particularly important context.

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 coverage is 100% and the description adds the important 'substring' interpretation of the query, plus the client-side filtering implication. The limit parameter is already fully described in the schema, so no further description is needed.

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

Purpose4/5

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

The description states a clear verb and resource: search for Mitti users by name or email substring. It does not explicitly name sibling users_list_users, so differentiation rests on the word 'search' rather than an explicit contrast.

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

Usage Guidelines3/5

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

The warning about fetching all users for client-side filtering and being inefficient for large organizations gives an implicit when-not-to-use signal. However, it does not mention alternatives such as users_list_users or state precise conditions for choosing this tool.

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

Tool Schema Changelog

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

  1. 17 tool updatesv0.2.0
    • First observedactions_create_action
    • First observedactions_get_action
    • First observedactions_list_actions
    • First observedactions_update_action_status
    • First observedactions_update_action_title
    • First observedinspections_complete_inspection
    • First observedinspections_get_inspection
    • First observedinspections_get_inspection_web_report_link
    • First observedinspections_list_inspections
    • First observedinspections_list_inspections_view
    • First observedrequest_approval
    • First observedtemplates_get_template
    • First observedtemplates_get_template_definition
    • First observedtemplates_list_templates
    • First observedusers_get_current_user
    • First observedusers_list_users
    • First observedusers_search_users

TDQS

A3.8/5.0

Scored across 17 tools

Disambiguation4/5

Most tools are clearly separated by resource (templates, inspections, actions, users) and action (list, get, create, update). The main ambiguity is between inspections_list_inspections and inspections_list_inspections_view, which return the same data but differ only in presentation format, and templates_get_template_definition vs templates_get_template could confuse agents looking for template details.

Naming Consistency4/5

Tool names follow a consistent resource_action pattern (e.g., inspections_list_inspections, actions_get_action, users_search_users). Minor deviations include request_approval lacking a resource prefix and templates_get_template_definition being more verbose than the pattern, but overall the convention is predictable.

Tool Count4/5

17 tools is slightly above the ideal range but reasonable for a server covering four distinct resource domains (templates, inspections, actions, users) plus an approval utility. Each tool serves a clear purpose, though a few could be consolidated (e.g., list_inspections vs list_inspections_view).

Completeness4/5

The server covers the main workflows: listing and retrieving templates, inspections, actions, and users, plus creating actions and updating action status/title. Gaps include no create/update for templates or inspections, no delete operations, and no way to update inspection details, but the core read and action-management workflows are covered.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers