Skip to main content
Glama
eduardoantoniojunior

OTRS MCP Server

Servidor MCP de OTRS

Un servidor Model Context Protocol (MCP) para la integración con la API de OTRS (Open Ticket Request System).

Esto proporciona acceso a la gestión de tickets de OTRS a través de interfaces MCP estandarizadas, lo que permite a los asistentes de IA crear, buscar y gestionar tickets.

Características

  • Crear, leer, actualizar y buscar tickets

  • Acceder al historial y a la información detallada de los tickets

  • Valores predeterminados configurables para los tickets

  • Soporte para contenedores Docker

  • Soporte SSL/TLS con opciones de verificación de certificados

  • Proporcionar herramientas interactivas para asistentes de IA

La lista de herramientas es configurable, por lo que puedes elegir qué herramientas quieres poner a disposición del cliente MCP.

Related MCP server: tickiti-mcp

Requisitos previos

Configuración del servidor OTRS

Antes de usar este servidor MCP, necesitas configurar tu instancia de OTRS.

Paso 1: Accede al panel de administración de OTRS

  • URL: https://your-otrs-server/otrs/index.pl?Action=Admin

  • Inicia sesión con tus credenciales de administrador

Paso 2: Configura los Web Services

  1. Ve a: Administración del sistema → Web Services

  2. Crea o verifica que tienes un servicio web (por ejemplo, TestInterface) con estas operaciones:

    • ✅ SessionCreate

    • ✅ TicketCreate

    • ✅ TicketGet

    • ✅ TicketSearch

    • ✅ TicketUpdate

    • ✅ TicketHistoryGet

Paso 3: Anota la URL de tu servicio web

La URL de tu servicio web debería tener un formato similar a:

https://your-otrs-server/otrs/nph-genericinterface.pl/Webservice/YourWebserviceName

Paso 4: Asegura los permisos del usuario

Asegúrate de que tu usuario de OTRS tiene los permisos adecuados para:

  • Crear y actualizar tickets

  • Acceder a los elementos de configuración

  • Usar la interfaz genérica

Uso

Docker (recomendado)

La forma más fácil de ejecutar otrs-mcp con Claude Desktop es usando Docker. Si no tienes Docker instalado, puedes obtenerlo en el sitio web oficial de Docker.

Usar la imagen precompilada

Puedes usar la imagen Docker precompilada de GitHub Container Registry:

{
  "mcpServers": {
    "otrs": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "OTRS_BASE_URL=https://your-otrs-server/otrs/nph-genericinterface.pl/Webservice/TestInterface",
        "-e",
        "OTRS_USERNAME=your-username",
        "-e",
        "OTRS_PASSWORD=your-password",
        "-e",
        "OTRS_VERIFY_SSL=false",
        "-e",
        "OTRS_DEFAULT_QUEUE=Raw",
        "-e",
        "OTRS_DEFAULT_STATE=new",
        "-e",
        "OTRS_DEFAULT_PRIORITY=3 normal",
        "ghcr.io/eduardoantoniojunior/otrs-mcp-server:latest"
      ]
    }
  }
}

Compilar localmente

Si prefieres compilar la imagen localmente:

# Clone the repository
git clone https://github.com/eduardoantoniojunior/otrs-mcp-server.git
cd otrs-mcp-server

# Build the Docker image
docker build -t otrs-mcp-server .

# Run the container
docker run --rm -i \
  -e OTRS_BASE_URL="https://your-otrs-server/otrs/nph-genericinterface.pl/Webservice/TestInterface" \
  -e OTRS_USERNAME="your-username" \
  -e OTRS_PASSWORD="your-password" \
  -e OTRS_VERIFY_SSL="false" \
  otrs-mcp-server

Ejecutar con UV

Alternativamente, puedes ejecutar el servidor directamente con UV. Primero, configura tus variables de entorno:

export OTRS_BASE_URL="https://your-otrs-server/otrs/nph-genericinterface.pl/Webservice/TestInterface"
export OTRS_USERNAME="your-username"
export OTRS_PASSWORD="your-password"
export OTRS_VERIFY_SSL="false"
export OTRS_DEFAULT_QUEUE="Raw"
export OTRS_DEFAULT_STATE="new"
export OTRS_DEFAULT_PRIORITY="3 normal"
export OTRS_DEFAULT_TYPE="Unclassified"

Después, edita el archivo de configuración de Claude Desktop y añade la configuración del servidor:

{
  "mcpServers": {
    "otrs": {
      "command": "uv",
      "args": [
        "--directory",
        "<full path to otrs-mcp-server directory>",
        "run",
        "src/otrs_mcp/main.py"
      ],
      "env": {
        "OTRS_BASE_URL": "https://your-otrs-server/otrs/nph-genericinterface.pl/Webservice/TestInterface",
        "OTRS_USERNAME": "your-username",
        "OTRS_PASSWORD": "your-password",
        "OTRS_VERIFY_SSL": "false"
      }
    }
  }
}

Nota: si ves Error: spawn uv ENOENT en Claude Desktop, puede que necesites especificar la ruta completa de uv o establecer la variable de entorno NO_UV=1 en la configuración.

Variables de entorno

Variable

Obligatorio

Por defecto

Descripción

OTRS_BASE_URL

✅

-

URL base del servicio web de OTRS

OTRS_USERNAME

✅

-

Nombre de usuario de OTRS

OTRS_PASSWORD

✅

-

Contraseña de OTRS

OTRS_VERIFY_SSL

❌

false

Verificación del certificado SSL

OTRS_DEFAULT_QUEUE

❌

Raw

Cola por defecto para los tickets nuevos

OTRS_DEFAULT_STATE

❌

new

Estado por defecto para los tickets nuevos

OTRS_DEFAULT_PRIORITY

❌

3 normal

Prioridad por defecto para los tickets nuevos

OTRS_DEFAULT_TYPE

❌

Unclassified

Tipo por defecto para los tickets nuevos

Desarrollo

Las contribuciones son bienvenidas. Si tienes sugerencias o mejoras, abre un issue o crea una pull request.

Este proyecto tiene como objetivo Python 3.12 (ver requires-python en pyproject.toml) y está validado para su uso en producción en esa versión.

Este proyecto usa uv para gestionar las dependencias. Instala uv siguiendo las instrucciones de tu plataforma:

curl -LsSf https://astral.sh/uv/install.sh | sh

Instala Python 3.12 (si no lo tienes) y crea el entorno virtual con las dependencias fijadas:

# Install the interpreter (managed by uv)
uv python install 3.12

# Create the environment and install dependencies from uv.lock
uv sync --python 3.12 --extra dev

También puedes usar el flujo de trabajo clásico:

uv venv --python 3.12
source .venv/bin/activate  # On Unix/macOS
.venv\Scripts\activate     # On Windows
uv pip install -e .

Pruebas

Prueba tu conexión con OTRS y la funcionalidad de la API:

# Set environment variables
export OTRS_BASE_URL="https://your-otrs-server/otrs/nph-genericinterface.pl/Webservice/TestInterface"
export OTRS_USERNAME="your-username"
export OTRS_PASSWORD="your-password"
export OTRS_VERIFY_SSL="false"

# Run connectivity test
uv run python tests/connectivity_test.py

# Run API functionality test
uv run python tests/test_working_api.py

# Run debug diagnostics
uv run python tests/debug_test.py

El proyecto incluye scripts de prueba que ayudan a verificar tu configuración y la conectividad con la API de OTRS.

Ejecuta las pruebas con pytest:

# Install development dependencies
uv pip install -e ".[dev]"

# Run the tests
pytest

# Run with coverage report
pytest --cov=src --cov-report=term-missing

Publicar la imagen Docker

Para publicar la imagen Docker en GitHub Container Registry para de uso público:

Requisitos previos

  1. Cuenta de GitHub con un repositorio para este proyecto

  2. GitHub Personal Access Token con permiso write:packages

  3. Docker instalado localmente

Publicación paso a paso

  1. Genera un GitHub Personal Access Token:

    • Ve a GitHub Settings → Developer settings → Personal access tokens → Tokens (classic)

    • Genera un nuevo token con permisos write:packages y read:packages

    • Guarda el token de forma segura

  2. Inicia sesión en GitHub Container Registry:

    echo $GITHUB_TOKEN | docker login ghcr.io -u yourusername --password-stdin
  3. Compila y etiqueta la imagen:

    # Build the image
    docker build -t otrs-mcp-server .
    
    # Tag for GitHub Container Registry
    docker tag otrs-mcp-server ghcr.io/yourusername/otrs-mcp-server:latest
    docker tag otrs-mcp-server ghcr.io/yourusername/otrs-mcp-server:v0.1.0
  4. Sube la imagen al registro:

    # Push latest tag
    docker push ghcr.io/yourusername/otrs-mcp-server:latest
    
    # Push version tag
    docker push ghcr.io/yourusername/otrs-mcp-server:v0.1.0
  5. Haz público el paquete (opcional):

    • Ve a tu repositorio de GitHub

    • Navega a la sección Packages

    • Haz clic en tu paquete

    • Ve a Package settings

    • Cambia la visibilidad a Public

Publicación automatizada con GitHub Actions

Crea .github/workflows/docker-publish.yml:

name: Build and Push Docker Image

on:
  push:
    branches: [main]
    tags: ["v*"]
  pull_request:
    branches: [main]

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}

jobs:
  build-and-push:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Log in to Container Registry
        uses: docker/login-action@v3
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Extract metadata
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
          tags: |
            type=ref,event=branch
            type=ref,event=pr
            type=semver,pattern={{version}}
            type=semver,pattern={{major}}.{{minor}}

      - name: Build and push Docker image
        uses: docker/build-push-action@v5
        with:
          context: .
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

Alternativa: Docker Hub

Para publicar en Docker Hub en su lugar:

# Login to Docker Hub
docker login

# Tag for Docker Hub
docker tag otrs-mcp-server yourusername/otrs-mcp-server:latest
docker tag otrs-mcp-server yourusername/otrs-mcp-server:v0.1.0

# Push to Docker Hub
docker push yourusername/otrs-mcp-server:latest
docker push yourusername/otrs-mcp-server:v0.1.0

Luego actualiza la configuración de Claude Desktop para usar:

"ghcr.io/yourusername/otrs-mcp-server:latest"

o

"yourusername/otrs-mcp-server:latest"

Herramientas disponibles

🎫 Gestión de tickets

  • create_ticket - Crea un nuevo ticket en OTRS

  • get_ticket - Obtén información detallada de un ticket específico

  • search_tickets - Busca tickets según diferentes criterios

  • update_ticket - Actualiza las propiedades de un ticket existente

  • get_ticket_history - Obtén el historial completo de un ticket

📊 Recursos

  • otrs://ticket/{ticket_id} - Acceso directo a los datos del ticket

  • otrs://ticket/{ticket_id}/history - Acceso al historial del ticket

  • otrs://search/tickets - Visión general de los tickets recientes

Solución de problemas

Problemas comunes

  1. Errores de certificado SSL: Configura OTRS_VERIFY_SSL=false para certificados autofirmados.

  2. Redirecciones HTTP 301: Asegúrate de usar URLs HTTPS si tu servidor OTRS redirige HTTP a HTTPS.

  3. Fallos de autenticación: Verifica tu usuario, tu contraseña y la configuración del servicio web.

  4. Operaciones que faltan: Comprueba que tu servicio web de OTRS incluye todas las operaciones requeridas.

Modo de depuración

Ejecuta el script de depuración para diagnosticar problemas de conexión:

uv run python tests/debug_test.py

Esto probará las conexiones HTTP y HTTPS y proporcionará información detallada sobre los errores.

Ejemplo de configuración que funciona

Para tu referencia, aquí tienes una configuración válida de ejemplo:

# Environment variables
export OTRS_BASE_URL="https://your-otrs-server/otrs/nph-genericinterface.pl/Webservice/TestInterface"
export OTRS_USERNAME="your-username"
export OTRS_PASSWORD="your-password"
export OTRS_VERIFY_SSL="false"
export OTRS_DEFAULT_QUEUE="Raw"
export OTRS_DEFAULT_STATE="new"
export OTRS_DEFAULT_PRIORITY="3 normal"
export OTRS_DEFAULT_TYPE="Unclassified"

Operaciones del servicio web de OTRS

Tu servicio web de OTRS debe incluir estas operaciones:

Nombre de la operación

Controller

Descripción

TicketCreate

Ticket::TicketCreate

Crear tickets nuevos

TicketGet

Ticket::TicketGet

Obtener detalles del ticket

TicketSearch

Ticket::TicketSearch

Buscar tickets

TicketUpdate

Ticket::TicketUpdate

Actualizar tickets existentes

TicketHistoryGet

Ticket::TicketHistoryGet

Obtener el historial del ticket

Licencia

Apache-2.0


Available Tools

5 tools
create_ticketC

Create a new ticket in OTRS

NameRequiredDescriptionDefault
bodyYes
queueNo
stateNo
titleYes
priorityNo
ticket_typeNo
customer_userNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.7/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of disclosing side effects. It only names the action without noting that a persistent OTRS record is created, whether calls are idempotent, whether authentication is required, or what errors may occur.

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?

A single 7-word sentence with zero filler and the verb front-loaded. It is appropriately brief, though it borders on under-specification rather than genuine explanatory economy.

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

Completeness2/5

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

A 7-parameter tool with no annotations and no parameter descriptions needs far more than a purpose statement; the description omits the required title/body contract and how optional fields are validated. The presence of an output schema covers return values, which keeps this from a 1, but an agent still lacks essential calling context.

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

Parameters2/5

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

Schema description coverage is 0% across 7 parameters, so the description must compensate, but it names no parameters at all. An agent is left with bare parameter names (body, queue, state, priority, ticket_type, customer_user) plus title, with no format, allowable-value, or domain guidance.

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?

States a specific verb ('Create') and resource ('a new ticket in OTRS'), and the word 'new' cleanly separates it from the update_ticket sibling. It is accurate and unambiguous, though it adds only the 'in OTRS' context beyond what the tool name already communicates.

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?

No guidance on when to use this tool versus get_ticket, search_tickets, or update_ticket. No prerequisites, ordering constraints, or when-not-to-use conditions are mentioned; usage context must be entirely inferred from the tool name.

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

get_ticketB

Get ticket details from OTRS

NameRequiredDescriptionDefault
ticket_idYes
include_extended_dataNo
include_dynamic_fieldsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.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 burden of indicating safety; the word 'Get' clearly conveys a read-only retrieval with no mutation, which is useful. However, it adds no detail about access requirements, behavior of the include flags, or potential response size, though some of this is covered by the output schema.

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?

A single sentence, front-loaded with the verb and object, with no filler. It is appropriately sized for a simple retrieval tool.

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?

The output schema covers return shape, so that burden is lifted. Still, with no annotations and sibling tools present, the description doesn't clarify when to choose this tool or how extended data and dynamic fields affect the result, leaving clear gaps in context.

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

Parameters2/5

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

Schema description coverage is 0% and the description adds no parameter-specific meaning beyond the raw schema titles. The required ticket_id is inferable from tool name, but include_extended_data and include_dynamic_fields are not explained, making this less than adequate.

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 identifies a get operation on ticket details from OTRS, which is the correct resource and verb. It does not explicitly contrast with siblings such as get_ticket_history or search_tickets, so it stops short of the top score.

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?

No guidance is given about when to use this tool over search_tickets, get_ticket_history, or other siblings. The meaning is inferable but not stated; an agent is not told that this is for fetching a single known ticket by ID.

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

get_ticket_historyC

Get ticket history from OTRS

NameRequiredDescriptionDefault
ticket_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.8/5.0
Behavior2/5

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

No annotations are present, so the description carries the full burden. It indicates a read operation but does not disclose what 'history' includes, whether it returns change logs versus messages, what auth or prerequisites are needed, or how results are ordered/limited.

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 a single efficient sentence with no filler. It could carry more useful detail, but it is well-structured and front-loaded for a simple tool.

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?

With only one parameter and an output schema available, the basic invocation path is reasonably clear. However, the description lacks enough detail about what constitutes ticket history and under what circumstances to choose this over get_ticket, leaving some ambiguity.

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

Parameters2/5

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

Schema description coverage is 0%, and the description does not explain the ticket_id parameter beyond its name and string type. The parameter name is fairly self-explanatory, but the description adds no semantic value to compensate for the missing schema documentation.

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 ('Get'), a specific resource ('ticket history'), and the system ('OTRS'). It is distinguishable from siblings like get_ticket by name and resource, though it does not explicitly contrast itself with them.

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 on when to use this tool versus get_ticket or search_tickets. The intended context is implied by the name and description, but no exclusions, alternatives, or conditions are provided.

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

search_ticketsC

Search for tickets in OTRS

NameRequiredDescriptionDefault
limitNo
queueNo
stateNo
titleNo
sort_byNoAge
order_byNoDown
priorityNo
customer_idNo
customer_userNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.4/5.0
Behavior2/5

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

No annotations exist, so the description carries the full disclosure burden, yet it reveals nothing about match semantics, how filters combine, the default sort (Age/Down), or limit/pagination behavior. The output schema helps with return shape but not with behavioral traits an agent needs to predict the tool's effect.

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 single sentence is lean and front-loaded with the core action, but for a tool with 9 optional parameters, this brevity is under-specification rather than efficient structure. There are no wasted words, yet no additional context is packed into the available space.

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

Completeness2/5

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

Given moderate complexity (9 optional filters, no annotations, 0% schema coverage), the description is far too thin to support correct invocation. An agent would not know how filters behave, what values queue/state accept, or how sorting works; the output schema covers only what is returned, not how to call the tool properly.

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

Parameters1/5

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

Schema description coverage is 0% across 9 parameters, and the description does nothing to compensate. It never mentions the filter parameters, does not explain valid values for sort_by/order_by, and does not clarify the distinction between customer_id and customer_user, leaving the agent to guess parameter meaning.

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 specific verb ('Search') and resource ('tickets in OTRS'), clearly identifying the tool's core action. The sibling tools use distinct verbs (create, get, update, get_history), so search is implicitly differentiated as the query-multiple-tickets operation, though no explicit contrast is given.

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?

No guidance is provided on when to use this tool versus alternatives. An agent must infer that get_ticket retrieves a single ticket while search_tickets finds tickets by criteria, but nothing states this, and no exclusions or alternative recommendations are offered.

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

update_ticketC

Update an existing ticket in OTRS

NameRequiredDescriptionDefault
ownerNo
queueNo
stateNo
titleNo
priorityNo
ticket_idYes
customer_userNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.8/5.0
Behavior2/5

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

With no annotations provided, the description must disclose behavioral details on its own. It communicates that the tool mutates an existing ticket, but it does not explain whether updates are partial, what fields are affected, what authorization is needed, or how invalid ticket IDs are handled.

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 a single front-loaded sentence with no filler or redundancy. It is concise, though its brevity contributes to the under-specification penalized in other dimensions.

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

Completeness2/5

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

For a tool with 7 parameters and no annotation or schema descriptions, one short sentence is insufficient. The description covers the core operation but omits field-level update semantics, optionality behavior, and error conditions; the presence of an output schema only accounts for return values, not input behavior.

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

Parameters1/5

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

Schema description coverage is 0% and the description adds no parameter information. The 7 parameters, including optional nullable fields like state, priority, and owner, are left entirely to the agent to infer from their titles, so the description fails to compensate for the schema's lack of explanations.

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 specific action and resource: 'Update an existing ticket in OTRS'. It clearly indicates this tool modifies an already-created ticket, which distinguishes it from create_ticket and the read-only siblings, but it does not enumerate the updatable fields or explicitly name alternatives.

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?

Usage is only implied: use this tool when an existing OTRS ticket needs to be modified. There is no explicit guidance on when to prefer it over create_ticket or get_ticket, and no conditions, prerequisites, or exclusions are provided.

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. 5 tool updatesv0.2.0
    • First observedcreate_ticket
    • First observedget_ticket
    • First observedget_ticket_history
    • First observedsearch_tickets
    • First observedupdate_ticket

TDQS

B3.3/5.0

Scored across 5 tools

Disambiguation5/5

Each tool targets a distinct operation on tickets: create, retrieve individual details, search, update, and retrieve history. There is no meaningful overlap between get_ticket and get_ticket_history because one returns current state and the other returns the audit trail.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern with snake_case: create_ticket, get_ticket, search_tickets, update_ticket, get_ticket_history. The only minor variation is the plural 'tickets' in search_tickets, which is natural and does not break the pattern.

Tool Count5/5

Five tools is well-scoped for a ticket management server. Each tool represents a core operation without unnecessary redundancy, making the set easy to navigate.

Completeness5/5

The tool surface covers the essential ticket lifecycle: creation, retrieval, search, update, and history lookup. For OTRS, this is a complete and practical set with no obvious dead ends.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    C
    quality
    C
    maintenance
    An MCP server that enables AI assistants to interact with JIRA, allowing for querying issue details, creating and updating work items, and managing attachments through a standardized interface.
    12
    4
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    An MCP server that exposes the Tickiti helpdesk API to AI assistants, enabling ticket management and helpdesk operations via natural language.
    11
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    An MCP server that connects AI assistants to Zammad, providing tools for managing tickets, users, organizations, and attachments.
    48
    AGPL 3.0