KRA eTIMS MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@KRA eTIMS MCP Servervalidate this eTIMS invoice JSON and explain any KRA error codes"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
KRA eTIMS MCP Server
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 |
| [x] Supported |
Google Antigravity |
| [x] Supported |
Zed IDE |
| [x] Supported |
Claude Code |
| [x] Supported |
OpenAI Codex |
| [x] Supported |
GitHub Copilot |
| [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-mcpClient 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-mcpOr 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.
Option A: Docker Compose (Recommended)
Start the service:
docker compose up -dCheck health status:
curl http://localhost:3000/healthConnect your IDEs using the HTTP/SSE endpoint:
SSE Stream:
http://localhost:3000/sseMessages:
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 3000Run in STDIO mode directly from your IDE:
docker run -i --rm kra-etims-mcpOS-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)
Ensure Docker is running:
sudo systemctl enable --now dockerStart 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 3000Verify 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-mcpLinux Client Configuration File Paths:
Cursor:
~/.cursor/mcp.jsonor project.cursor/mcp.jsonGoogle Antigravity:
~/.gemini/config/mcp_config.jsonor project.agents/mcp_config.jsonZed IDE:
~/.config/zed/settings.jsonor project.zed/settings.jsonClaude Code:
~/.claude.jsonor project.mcp.jsonOpenAI Codex:
~/.codex/config.tomlGitHub Copilot / VS Code:
~/.config/Code/User/globalStorage/github.copilot/mcp.jsonor project.vscode/mcp.json
macOS (Apple Silicon M1/M2/M3/M4 & Intel)
Method 1: Docker (Docker Desktop or OrbStack)
Ensure Docker Desktop is open: Launch
Docker.apporOrbStack.appfrom Applications.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 3000Verify 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-mcpmacOS Client Configuration File Paths:
Cursor:
~/Library/Application Support/Cursor/User/globalStorage/cursor.mcp/mcp.jsonor project.cursor/mcp.jsonGoogle Antigravity:
~/.gemini/config/mcp_config.jsonor project.agents/mcp_config.jsonZed IDE:
~/Library/Application Support/Zed/settings.jsonor project.zed/settings.jsonClaude Code:
~/.claude.jsonor project.mcp.jsonOpenAI Codex:
~/.codex/config.tomlGitHub Copilot / VS Code:
~/Library/Application Support/Code/User/globalStorage/github.copilot/mcp.jsonor project.vscode/mcp.json
Windows (10 & 11)
Method 1: Docker Desktop (with WSL2 Backend)
Ensure Docker Desktop is running: Start Docker Desktop from the Start Menu. Ensure WSL2 integration is enabled.
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 3000Verify 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-mcpOn 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.jsonor project.cursor\mcp.jsonGoogle Antigravity:
%USERPROFILE%\.gemini\config\mcp_config.jsonor project.agents\mcp_config.jsonZed IDE:
%APPDATA%\Zed\settings.jsonor project.zed\settings.jsonClaude Code:
%USERPROFILE%\.claude.jsonor project.mcp.jsonOpenAI Codex:
%USERPROFILE%\.codex\config.tomlGitHub Copilot / VS Code:
%APPDATA%\Code\User\globalStorage\github.copilot\mcp.jsonor project.vscode\mcp.json
Capabilities & Developer Tools
1. Tools
Tool | Description |
| Sub-millisecond full-text and fuzzy search across guides, API endpoints, error codes, and code tables. |
| Inspect full request/response schemas, URLs, required headers, and parameters for OSCU or VSCU endpoints. |
| 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). |
| Validates PIN formats (11-chars: P/A + 9 digits + letter), branch IDs, timestamps, and verifies that tax amounts balance ( |
| Generates ready-to-run, mathematically sound JSON request bodies for sales invoices, credit notes, item registration, stock in/out, and device handshake. |
| Instant diagnostics for KRA error codes ( |
| Formats receipt parameters into the official cryptographic KRA QR code string ( |
2. Resources (etims://...)
Directly attachable knowledge documents:
etims://docs/oscu-vs-vscu— OSCU vs VSCU Architecture & Integration Guideetims://docs/onboarding-guide— Step-by-step Onboarding & Handshake Guideetims://docs/credit-notes-rules— Credit Notes & Invoice Reversal Rulesetims://docs/buyer-initiated-invoicing— Buyer-Initiated Invoicing (BII) & Reverse Invoicingetims://docs/stock-management— Mandatory Stock Management Guideetims://docs/fuel-station-system— Forecourt Automation & Fuel Station Systemetims://docs/tis-qr-code-spec— TIS Receipt Layout & QR Code Formulaetims://codes/all— All system code tables dictionaryetims://errors/all— All error codes and troubleshooting catalogetims://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 onstdoutremains uncorrupted.
Development & Testing
Install dependencies:
npm installBuild project:
npm run buildRun automated tests:
npm testType checking:
npm run typecheck
License
MIT © 2026 KRA eTIMS Open Source Community
Available Tools
7 toolsexplain_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.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The error code string returned by KRA API or TIS device (e.g. '901', '903', '910', '994', '11', '20') |
TDQS
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.
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.
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.
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.
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.
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'.
| Name | Required | Description | Default |
|---|---|---|---|
| time | Yes | Time formatted as HHMMSS (e.g. '123005') | |
| cu_number | Yes | Control Unit ID (sdcId from response, e.g. 'KRAMW010000001') | |
| invoice_date | Yes | Invoice date formatted as DDMMYYYY (e.g. '22102026') or YYYYMMDD | |
| internal_data | Yes | Internal fiscal data returned in intrlData | |
| cu_receipt_number | Yes | Receipt counter number (rcptNo, e.g. 4521) | |
| receipt_signature | Yes | Cryptographic receipt signature returned in rcptSign |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | The integration scenario or document type to generate | |
| custom_pin | No | Optional custom seller KRA PIN to populate | |
| custom_buyer_pin | No | Optional custom buyer KRA PIN to populate |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| solution | No | Filter by integration solution type | ANY |
| endpoint_name | Yes | Endpoint name or partial path (e.g. 'saveTrnsSalesOsdc', 'selectInitOsdcInfo', 'saveItem', 'insertStockIO', 'selectCustomer') |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Optional specific code to inspect (e.g. 'B' for tax type, '06' for payment method, '15' for stock discarding) | |
| table_name | Yes | Code table identifier or 'all' to list all available tables |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return (default: 5) | |
| query | Yes | Search keywords or natural language question (e.g. 'credit note requirements', 'error 903', 'fuel station 8% VAT', 'selectInitOsdcInfo') | |
| category | No | Optional category filter to narrow results |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| payload_json | Yes | JSON string representing the request body or raw string value to validate | |
| payload_type | Yes | Type of payload or entity to validate |
TDQS
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.
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.
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.
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.
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.
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.
7 tool updates
v1.0.0- First observed
explain_error_code - First observed
generate_qr_code_string - First observed
generate_sample_payload - First observed
get_api_spec - First observed
lookup_code - First observed
search_knowledge_base - First observed
validate_etims_payload
TDQS
Scored across 7 tools
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.
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.
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.
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
Related MCP Connectors
Validate EU, UK, AU VAT numbers for AI agents. EU ViDA e-invoicing compliance.
Peru CPE invoices for AI agents - issue, query, void facturas/boletas via SUNAT (2 backends).
Any REST/SOAP/GraphQL/OData/SQL API as MCP tools for Claude & ChatGPT. 529 connectors: SAP, ERP.
Connect Claude.ai, ChatGPT and MCP-compatible coding clients to aictrl engineering workflows. Check account readiness, find and run tasks, inspect workflow progress and approvals, review pull-request findings, and query repository context. Uses OAuth and your aictrl organisation's permissions.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides 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.3MIT
- AlicenseAqualityDmaintenanceValidates 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.317 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables 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
- FlicenseNot gradedqualityCmaintenanceEnables 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.-