Skip to main content
Glama

KRA eTIMS MCP Server

License: MIT TypeScript Model Context Protocol

A high-performance Model Context Protocol (MCP) server providing complete, authoritative knowledge, API schemas, validation rules, code snippets, and automated error diagnostics for Kenya Revenue Authority (KRA) eTIMS integrations.

Enables AI coding assistants to seamlessly write, validate, and troubleshoot eTIMS integrations across OSCU (Cloud REST), VSCU (Virtual Sales Control Unit), TIS (Trader Invoicing System), Buyer-Initiated Invoicing (BII), Fuel Station Automation, and Stock Management.


Supported AI Assistants

Works out-of-the-box via the standard STDIO transport with:

Assistant / IDE

Configuration Location

Status

Cursor

.cursor/mcp.json or ~/.cursor/mcp.json

[x] Supported

Google Antigravity

.agents/mcp_config.json or /mcp CLI

[x] Supported

Zed IDE

.zed/settings.json or ~/.config/zed/settings.json

[x] Supported

Claude Code

.mcp.json or claude mcp add

[x] Supported

OpenAI Codex

~/.codex/config.toml

[x] Supported

GitHub Copilot

.vscode/mcp.json

[x] Supported


Related MCP server: eleata e-invoice MCP server

Quickstart (Zero-Install via NPX)

You can run the server directly without cloning or building:

npx -y kra-etims-mcp

Client Setup Instructions

1. Cursor

Add to your project's .cursor/mcp.json (or global ~/.cursor/mcp.json):

{
  "mcpServers": {
    "kra-etims": {
      "command": "npx",
      "args": ["-y", "kra-etims-mcp"]
    }
  }
}

2. Google Antigravity

Add to .agents/mcp_config.json in your workspace root, or configure interactively using the /mcp command:

{
  "mcpServers": {
    "kra-etims": {
      "command": "npx",
      "args": ["-y", "kra-etims-mcp"]
    }
  }
}

3. Zed IDE

Add to .zed/settings.json in your project or global ~/.config/zed/settings.json:

{
  "context_servers": {
    "kra-etims": {
      "command": {
        "path": "npx",
        "args": ["-y", "kra-etims-mcp"]
      }
    }
  }
}

Or when running via local Docker container:

{
  "context_servers": {
    "kra-etims": {
      "command": {
        "path": "docker",
        "args": ["run", "-i", "--rm", "kra-etims-mcp"]
      }
    }
  }
}

4. Claude Code

Run the CLI command:

claude mcp add --transport stdio kra-etims -- npx -y kra-etims-mcp

Or create .mcp.json in your repository root:

{
  "mcpServers": {
    "kra-etims": {
      "command": "npx",
      "args": ["-y", "kra-etims-mcp"]
    }
  }
}

5. OpenAI Codex

Add to ~/.codex/config.toml:

[mcp_servers.kra-etims]
command = "npx"
args = ["-y", "kra-etims-mcp"]

6. GitHub Copilot (VS Code)

Add to .vscode/mcp.json:

{
  "mcpServers": {
    "kra-etims": {
      "command": "npx",
      "args": ["-y", "kra-etims-mcp"]
    }
  }
}

Running in Docker (Automatic Reboot Restart)

The server can run as a background container configured with restart: unless-stopped, so it stays alive across host reboots.

  1. Start the service:

docker compose up -d
  1. Check health status:

curl http://localhost:3000/health
  1. Connect your IDEs using the HTTP/SSE endpoint:

  • SSE Stream: http://localhost:3000/sse

  • Messages: http://localhost:3000/message

Option B: Docker CLI

Run in daemon mode with automatic reboot restart:

docker run -d \
  --name kra-etims-mcp \
  --restart unless-stopped \
  -p 3000:3000 \
  kra-etims-mcp --http 3000

Run in STDIO mode directly from your IDE:

docker run -i --rm kra-etims-mcp

OS-Specific Startup & Setup Guide (Linux, macOS, Windows)

Whether you choose Docker or Node.js (npx), follow the instructions below tailored to your operating system.


Linux (Ubuntu, Debian, Fedora, Arch, CentOS)

Method 1: Docker (Single Command with Reboot Auto-Restart)

  1. Ensure Docker is running:

    sudo systemctl enable --now docker
  2. Start the container:

    docker compose up -d

    (Or with pure Docker CLI):

    docker run -d --name kra-etims-mcp --restart unless-stopped -p 3000:3000 kra-etims-mcp --http 3000
  3. Verify running status:

    curl http://localhost:3000/health

Method 2: Node.js / NPX (No Docker Required)

Requires Node.js 18+ installed (node -v):

npx -y kra-etims-mcp

Linux Client Configuration File Paths:

  • Cursor: ~/.cursor/mcp.json or project .cursor/mcp.json

  • Google Antigravity: ~/.gemini/config/mcp_config.json or project .agents/mcp_config.json

  • Zed IDE: ~/.config/zed/settings.json or project .zed/settings.json

  • Claude Code: ~/.claude.json or project .mcp.json

  • OpenAI Codex: ~/.codex/config.toml

  • GitHub Copilot / VS Code: ~/.config/Code/User/globalStorage/github.copilot/mcp.json or project .vscode/mcp.json


macOS (Apple Silicon M1/M2/M3/M4 & Intel)

Method 1: Docker (Docker Desktop or OrbStack)

  1. Ensure Docker Desktop is open: Launch Docker.app or OrbStack.app from Applications.

  2. Start the container: In Terminal (zsh):

    docker compose up -d

    (Or with pure Docker CLI):

    docker run -d --name kra-etims-mcp --restart unless-stopped -p 3000:3000 kra-etims-mcp --http 3000
  3. Verify running status:

    curl http://localhost:3000/health

Method 2: Node.js / NPX (No Docker Required)

Requires Node.js installed (brew install node):

npx -y kra-etims-mcp

macOS Client Configuration File Paths:

  • Cursor: ~/Library/Application Support/Cursor/User/globalStorage/cursor.mcp/mcp.json or project .cursor/mcp.json

  • Google Antigravity: ~/.gemini/config/mcp_config.json or project .agents/mcp_config.json

  • Zed IDE: ~/Library/Application Support/Zed/settings.json or project .zed/settings.json

  • Claude Code: ~/.claude.json or project .mcp.json

  • OpenAI Codex: ~/.codex/config.toml

  • GitHub Copilot / VS Code: ~/Library/Application Support/Code/User/globalStorage/github.copilot/mcp.json or project .vscode/mcp.json


Windows (10 & 11)

Method 1: Docker Desktop (with WSL2 Backend)

  1. Ensure Docker Desktop is running: Start Docker Desktop from the Start Menu. Ensure WSL2 integration is enabled.

  2. Start the container (Run in PowerShell or Command Prompt):

    docker compose up -d

    (Or with pure Docker CLI):

    docker run -d --name kra-etims-mcp --restart unless-stopped -p 3000:3000 kra-etims-mcp --http 3000
  3. Verify running status:

    curl http://localhost:3000/health
    # or in PowerShell:
    Invoke-RestMethod http://localhost:3000/health

Method 2: Node.js / NPX on Windows

Requires Node.js installed from nodejs.org:

npx -y kra-etims-mcp
NOTE

On Windows, some tools require specifyingcmd.exe /c npx -y kra-etims-mcp if npx is a .cmd batch script. Example for Windows mcp.json:

{
  "mcpServers": {
    "kra-etims": {
      "command": "cmd.exe",
      "args": ["/c", "npx", "-y", "kra-etims-mcp"]
    }
  }
}

Or when using Docker directly on Windows:

{
  "mcpServers": {
    "kra-etims": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "kra-etims-mcp"]
    }
  }
}

Windows Client Configuration File Paths:

  • Cursor: %APPDATA%\Cursor\User\globalStorage\cursor.mcp\mcp.json or project .cursor\mcp.json

  • Google Antigravity: %USERPROFILE%\.gemini\config\mcp_config.json or project .agents\mcp_config.json

  • Zed IDE: %APPDATA%\Zed\settings.json or project .zed\settings.json

  • Claude Code: %USERPROFILE%\.claude.json or project .mcp.json

  • OpenAI Codex: %USERPROFILE%\.codex\config.toml

  • GitHub Copilot / VS Code: %APPDATA%\Code\User\globalStorage\github.copilot\mcp.json or project .vscode\mcp.json


Capabilities & Developer Tools

1. Tools

Tool

Description

search_knowledge_base

Sub-millisecond full-text and fuzzy search across guides, API endpoints, error codes, and code tables.

get_api_spec

Inspect full request/response schemas, URLs, required headers, and parameters for OSCU or VSCU endpoints.

lookup_code

Query KRA code tables (Tax categories A-E, Payment methods 01-07, Credit note reasons 01-13, Stock movement types 01-16, Packaging units, HS codes).

validate_etims_payload

Validates PIN formats (11-chars: P/A + 9 digits + letter), branch IDs, timestamps, and verifies that tax amounts balance (totAmt = totTaxblAmt + totTaxAmt).

generate_sample_payload

Generates ready-to-run, mathematically sound JSON request bodies for sales invoices, credit notes, item registration, stock in/out, and device handshake.

explain_error_code

Instant diagnostics for KRA error codes (000, 901, 903, 910, 994, TIS hardware/software codes) with exact root cause and fix steps.

generate_qr_code_string

Formats receipt parameters into the official cryptographic KRA QR code string (date#time#cu#rcpt#internal#signature).

2. Resources (etims://...)

Directly attachable knowledge documents:

  • etims://docs/oscu-vs-vscu — OSCU vs VSCU Architecture & Integration Guide

  • etims://docs/onboarding-guide — Step-by-step Onboarding & Handshake Guide

  • etims://docs/credit-notes-rules — Credit Notes & Invoice Reversal Rules

  • etims://docs/buyer-initiated-invoicing — Buyer-Initiated Invoicing (BII) & Reverse Invoicing

  • etims://docs/stock-management — Mandatory Stock Management Guide

  • etims://docs/fuel-station-system — Forecourt Automation & Fuel Station System

  • etims://docs/tis-qr-code-spec — TIS Receipt Layout & QR Code Formula

  • etims://codes/all — All system code tables dictionary

  • etims://errors/all — All error codes and troubleshooting catalog

  • etims://api/catalog — Complete API endpoints catalog

3. Guided Prompts

  • scaffold-etims-client — Scaffolds an eTIMS API client in TypeScript, Python, PHP, or Go.

  • debug-etims-error — Interactive troubleshooting for failed KRA requests.

  • implement-credit-note — Step-by-step credit note generation sequence.

  • setup-stock-sync — Workflow for mandatory stock synchronization.


Performance & Architecture

  • Sub-2ms Execution: In-memory pre-compiled index powered by MiniSearch.

  • Zero Disk Overhead: Static assets and code tables are bundled at build time; no database or external network calls needed during knowledge queries.

  • Safe Stdio Transport: All diagnostic logging writes strictly to stderr, ensuring the JSON-RPC 2.0 communication channel on stdout remains uncorrupted.


Development & Testing

  1. Install dependencies:

    npm install
  2. Build project:

    npm run build
  3. Run automated tests:

    npm test
  4. Type checking:

    npm run typecheck

License

MIT © 2026 KRA eTIMS Open Source Community

Available Tools

7 tools
explain_error_codeA

Diagnose and resolve KRA eTIMS error codes (e.g., 000, 901, 903, 910, 994, TIS memory/clock codes). Returns cause, description, and concrete fix steps.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesThe error code string returned by KRA API or TIS device (e.g. '901', '903', '910', '994', '11', '20')

TDQS

A4/5.0
Behavior3/5

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

No annotations exist, so the description carries the disclosure burden. It does describe the response payload (cause, description, concrete fix steps), which is genuinely useful since no output schema exists, but it says nothing about behavior on unknown/invalid codes, whether it is purely a read/lookup, or coverage limits.

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 sentences, front-loaded with the action and resource, followed by the return contract. No filler or restatement of the tool name.

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 one-parameter lookup with no output schema, the description supplies the essential missing piece: what comes back (cause, description, fix steps). Only the edge-case behavior for unrecognized codes is left implicit.

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 'code' parameter is already fully documented with its own examples. The description's added examples (000, TIS memory/clock codes) marginally extend the schema's list but do not explain format or matching rules beyond 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?

States a specific verb pair ('Diagnose and resolve') against a specific resource ('KRA eTIMS error codes') and enumerates representative codes. This separates it cleanly from generic siblings like search_knowledge_base or lookup_code, which do not promise diagnosis plus fix steps.

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 usage context is clear: you invoke it when you hold a KRA API or TIS device error code and need a remedy. It stops short of explicit routing ('use X instead of lookup_code when...'), so there is no when-not guidance, but the trigger condition is unambiguous.

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

generate_qr_code_stringA

Formats invoice confirmation data into the official KRA eTIMS QR code string: 'invoice_date(ddmmyyyy)#time(hhmmss)#cu_number#cu_receipt_number#internal_data#receipt_signature'.

ParametersJSON Schema
NameRequiredDescriptionDefault
timeYesTime formatted as HHMMSS (e.g. '123005')
cu_numberYesControl Unit ID (sdcId from response, e.g. 'KRAMW010000001')
invoice_dateYesInvoice date formatted as DDMMYYYY (e.g. '22102026') or YYYYMMDD
internal_dataYesInternal fiscal data returned in intrlData
cu_receipt_numberYesReceipt counter number (rcptNo, e.g. 4521)
receipt_signatureYesCryptographic receipt signature returned in rcptSign

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations, the description carries the full burden, and it does disclose the output structure precisely (field order and '#' separator), which is genuinely useful. But it never states whether this is a pure local formatting operation or a network call to KRA, nor whether signing/credentials are needed – ambiguous given the sibling set mixes API-spec and validation tools.

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 front-loaded sentence with the exact format template appended; nothing redundant, and the essential output contract is stated first.

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?

With no output schema and no annotations, the description does the heavy lifting by fully specifying the returned string layout and all six required inputs are documented in the schema. It falls short only on execution semantics (local formatting vs. remote call) and on how date-format ambiguity is handled.

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 baseline is 3, but the description adds real meaning beyond the schema by specifying the concatenation order and the '#' delimiter for all six values, which the property descriptions do not convey. It doesn't address the alternate accepted date format (DDMMYYYY vs YYYYMMDD) noted in the schema.

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 gives a specific verb ('formats') and resource ('invoice confirmation data into the official KRA eTIMS QR code string'), and spells out the exact output template. The operation is distinct from siblings like validate_etims_payload and generate_sample_payload, though the description never explicitly contrasts 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 Guidelines3/5

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

Usage is only implied by 'invoice confirmation data' – an agent can infer this runs after a successful invoice submission, but there is no explicit when-to-use statement, no prerequisite ordering versus validate_etims_payload, and no exclusions.

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

generate_sample_payloadA

Generates production-ready, mathematically balanced sample JSON request payloads for eTIMS endpoints (sales, credit notes, item registration, stock in/out, handshake).

ParametersJSON Schema
NameRequiredDescriptionDefault
typeYesThe integration scenario or document type to generate
custom_pinNoOptional custom seller KRA PIN to populate
custom_buyer_pinNoOptional custom buyer KRA PIN to populate

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It adds useful traits such as 'production-ready' and 'mathematically balanced' and implies generation rather than submission, but it does not explicitly state side-effect behavior, return format, determinism, or how generated payloads relate to validation.

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 front-loaded sentence with no filler. The parenthetical examples are compact and support immediate understanding of scope.

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 generator with fully documented parameters and no output schema, the description covers the core purpose and scenario scope. However, it leaves out what the returned payload structure looks like, whether multiple payloads are returned, and how this tool pairs with validation or API spec tools.

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 parameter meanings are already documented in the schema. The description's scenario list loosely maps to the type enum but does not explain custom_pin or custom_buyer_pin, so it adds little beyond the schema baseline.

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 and resource: generating sample JSON request payloads for eTIMS endpoints, with named scenarios. It is clear what the tool does, though it does not explicitly distinguish itself from siblings such as validate_etims_payload or get_api_spec.

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 context of generating sample payloads for eTIMS endpoints implies when the tool is useful, but the description gives no explicit guidance on when to choose it over validate_etims_payload or get_api_spec. Usage is inferable, not directed.

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

get_api_specB

Get full technical specifications, parameters, headers, and request/response payloads for an eTIMS API endpoint (OSCU or VSCU).

ParametersJSON Schema
NameRequiredDescriptionDefault
solutionNoFilter by integration solution typeANY
endpoint_nameYesEndpoint name or partial path (e.g. 'saveTrnsSalesOsdc', 'selectInitOsdcInfo', 'saveItem', 'insertStockIO', 'selectCustomer')

TDQS

B3.4/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 full burden. It does disclose the return content (parameters, headers, request/response payloads), which is useful, but omits behavior an agent would want: whether endpoint_name is fuzzy/partial-matched, what happens when no endpoint matches, and whether the response is a single spec or a list.

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 front-loaded sentence that lists the returned artifacts in a natural order (specs, parameters, headers, payloads). No filler or redundant restatement of the tool name.

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, two-parameter lookup with no output schema, the description does the essential work of telling the agent what the response contains. It falls just short on miss-handling and matching semantics, but nothing critical for correct invocation 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%, with both parameters documented inline and the solution enum fully spelled out, so the baseline is 3. The description only echoes the OSCU/VSCU distinction already present in the enum and adds no new detail such as expected casing or matching rules for endpoint_name.

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 (Get) and resource (technical specifications for an eTIMS API endpoint), enumerating what is returned: parameters, headers, and request/response payloads. It is clearly a documentation-lookup tool, though it never names how it differs from search_knowledge_base, which could plausibly surface similar content.

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?

The description gives no conditions for use and names no alternatives. An agent is left to infer that this is the tool for endpoint-level spec details rather than the generic knowledge-base search or the sample-payload generator; nothing states when this tool is preferred over those siblings.

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

lookup_codeB

Look up official KRA code tables or specific code definitions (tax types, payment methods, credit note reasons, stock movement types, packaging units, quantity units).

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoOptional specific code to inspect (e.g. 'B' for tax type, '06' for payment method, '15' for stock discarding)
table_nameYesCode table identifier or 'all' to list all available tables

TDQS

B3.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, and it does signal that the data is a static, authoritative KRA reference set ('official KRA code tables'), which reassures the agent no mutation occurs. However, it never says what a call returns (a list of codes, a single definition record, or both) or whether 'all' yields a different shape, which matters here because there is no 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.

Conciseness4/5

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

A single sentence that front-loads the verb and the resource, with the enumeration earning its place by telling the agent which domains are covered. The parenthetical list is long but each item is a real category the agent can match a question against.

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 two-parameter reference lookup with no output schema and no annotations, the description covers what the tool reads but not what comes back or in what form. The distinction between the list-table mode and the single-code mode is only implied, leaving the agent to guess the response shape before calling.

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 table_name enum is fully self-documenting, so the schema does the heavy lifting and the baseline of 3 applies. The description's parenthetical category list loosely mirrors enum members but adds no new syntax, defaults, or interaction rules beyond what the schema already states.

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+resource ('Look up official KRA code tables or specific code definitions') and enumerates the domains covered (tax types, payment methods, credit note reasons, etc.), so the agent knows exactly what data lives here. It stops short of naming a sibling, so it does not differentiate itself from search_knowledge_base or get_api_spec, which could plausibly surface overlapping reference content.

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 when-to-use guidance at all — nothing says to prefer this over search_knowledge_base for code lookups, or over get_api_spec when the agent needs schema-level detail. The two operating modes (pass table_name alone to list a whole table vs. add code to inspect one entry) are left for the agent to infer from the schema rather than stated.

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

search_knowledge_baseB

Search the comprehensive KRA eTIMS knowledge base (guides, API specs, error codes, code tables). Returns relevant excerpts with sub-millisecond execution.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results to return (default: 5)
queryYesSearch keywords or natural language question (e.g. 'credit note requirements', 'error 903', 'fuel station 8% VAT', 'selectInitOsdcInfo')
categoryNoOptional category filter to narrow results

TDQS

B3.2/5.0
Behavior3/5

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

No annotations exist, so the description carries the full burden. It does disclose the return shape ('relevant excerpts') and a distinctive performance trait ('sub-millisecond execution'), but says nothing about ranking/ordering, result coverage, or the fact that this is a non-mutating read (which is not stated anywhere in structured data).

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?

Two tight sentences with the capability front-loaded and zero redundancy. The 'sub-millisecond execution' clause is a marketing-flavored claim but does carry a small amount of performance signal, so it narrowly earns its place.

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 simple three-parameter search with no output schema, the description covers what is searched and roughly what comes back, but omits result ordering, whether excerpts carry source references, and where it sits relative to the more targeted sibling tools. Adequate, but with clear gaps an agent would notice when results are ambiguous.

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 explains query, limit and the category enum, and the baseline of 3 applies. The description adds only a loose mapping between the listed content types and the category enum values; it adds no syntax, formatting, or query-strategy guidance beyond the schema.

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 (Search) and a specific resource (the KRA eTIMS knowledge base) and enumerates the content types it covers (guides, API specs, error codes, code tables). It does not distinguish itself from siblings like get_api_spec, lookup_code or explain_error_code, which cover the very same content areas, so an agent cannot tell from the description alone which one to reach for.

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 explicit when-to-use or when-not-to-use guidance is given, and no alternative is named despite three siblings overlapping directly with the listed content categories. Usage is only implied by the word 'comprehensive', which suggests this is the broad first-pass search, but the agent must infer that.

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

validate_etims_payloadA

Validates eTIMS JSON payloads, KRA PINs, branch IDs, and ensures tax math (taxblAmtA-E, taxAmtA-E, totAmt) perfectly balances before submitting to KRA.

ParametersJSON Schema
NameRequiredDescriptionDefault
payload_jsonYesJSON string representing the request body or raw string value to validate
payload_typeYesType of payload or entity to validate

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It discloses the validation scope in useful detail (payloads, PINs, branch IDs, tax math), but does not explain what happens on failure, what the response contains, or whether the check has any side effects. Validation is implicitly safe, but that is not made explicit.

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 tightly packed sentence with no filler. The core purpose and the pre-submission timing are front-loaded, so an agent gets the essential context immediately.

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?

There is no output schema and no annotations, so the description should clarify what a validation call returns, such as a pass/fail result or detailed field errors. It explains what is checked but not the outcome format, leaving an important gap for a tool whose main value is the validation result.

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%, so both parameters are already documented in the input schema. The description adds domain context by naming the kinds of things validated, but it does not map them to payload_json or payload_type or explain the enum values beyond what the schema provides.

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 (validates) and concrete resources (eTIMS JSON payloads, KRA PINs, branch IDs, and tax fields). It is clearly distinct from siblings such as generate_sample_payload or explain_error_code, though it does not explicitly name or contrast against them.

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 'before submitting to KRA' gives a clear moment to use the tool. It does not state when not to use it or name alternatives, but the context is sufficient for an agent to infer the right stage of a submission workflow.

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. 7 tool updatesv1.0.0
    • First observedexplain_error_code
    • First observedgenerate_qr_code_string
    • First observedgenerate_sample_payload
    • First observedget_api_spec
    • First observedlookup_code
    • First observedsearch_knowledge_base
    • First observedvalidate_etims_payload

TDQS

A3.7/5.0

Scored across 7 tools

Disambiguation4/5

Most tools have distinct roles: endpoint specs, code-table lookup, payload validation, sample generation, QR formatting, and error diagnosis. The broad search_knowledge_base overlaps somewhat with lookup_code, explain_error_code, and get_api_spec, but the descriptions clarify when each specialized tool should be used.

Naming Consistency5/5

All names use consistent snake_case and generally follow a verb_noun or verb_object pattern such as search_knowledge_base, get_api_spec, validate_etims_payload, and generate_sample_payload. The convention is predictable throughout the set.

Tool Count5/5

Seven tools is a well-scoped set for a developer-facing KRA eTIMS assistant, covering lookup, generation, validation, and diagnosis without excessive surface area. Each tool appears to earn its place.

Completeness4/5

The surface covers key developer workflows: discovering API specs, looking up codes, validating payloads, generating samples, formatting QR strings, and resolving errors. It lacks direct submission or lifecycle tools, but for a knowledge/validation-oriented MCP server the coverage is strong with minor gaps.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides real-time OWASP ASVS security guidance and vulnerability scanning for AI coding agents. Enables proactive security during code generation by checking security requirements, scanning code for vulnerabilities, and suggesting secure code fixes.
    3
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Validates EU electronic invoices (Peppol, XRechnung, FatturaPA, etc.) and explains validation error codes, enabling AI coding agents to check invoice validity and get fixes before rejection.
    3
    17 npm
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI assistants to locally parse, validate, audit, explain, generate, and convert XRechnung and ZUGFeRD/Factur-X e-invoices using official rule sets, fully offline with no API keys required.
    Apache 2.0
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables AI coding agents to safely integrate cross-border payments by providing structured payment knowledge, deterministic validation of idempotency, security, and state-machine rules, webhook testing, executable pytest generation, and diagnosis for Python/FastAPI Checkout projects.
    -