mcp-server-db2i
This MCP server lets AI assistants securely query and inspect IBM Db2 for i databases in read-only mode over stdio or HTTP.
Execute read-only SELECT queries with automatic row limits, query timeouts, prepared parameters, and error diagnostics.
Export query results to CSV/XLSX as a file path or short-lived download link, keeping rows out of the model.
Inspect schemas/libraries, tables, views, columns, indexes, constraints, routines, and aliases.
Search tables, columns, and IBM i SQL services by name or description across libraries.
Validate SQL statements without executing them, checking table/column/routine existence and read-only/schema-allowlist compliance.
Retrieve DDL for objects, list dependent objects, check journaling/replication readiness, and get optimizer index advice.
Profile tables for row counts, deleted rows, size, last change, and per-column distinct/null/low/high values.
Load and use business context and custom read-only SQL tools from YAML: descriptions, row filters, relations, and instructions.
Read table columns/DDL and business context as MCP resources; use prompts to explore libraries, explain tables, or write queries.
Connect to multiple IBM i systems via profiles using ODBC, JT400 JDBC, or Mapepire over SSH.
Authenticate remote clients with OAuth 2.1 or bearer tokens; run stdio and HTTP simultaneously.
Apply column masking, audit logging, tool selection, rate limiting, and schema allowlists for security and control.
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., "@mcp-server-db2ilist the columns for the INV_HEADER table in the ERP_DATA schema"
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.
Db2 for i MCP Server
mcp-server-db2i is a Model Context Protocol (MCP) server for IBM Db2 for i (Db2i) on IBM i (AS/400). It enables AI assistants like Claude and Cursor to query and inspect IBM i databases through the IBM i Access ODBC driver, or optionally the JT400 JDBC driver or Mapepire over SSH.
Listed in the MCP Registry as io.github.Strom-Capital/mcp-server-db2i.
Website: db2i-mcp.com, with a blog that explains each release. Docs: docs.db2i-mcp.com.
Architecture
AI clients connect to the MCP Server in one of two ways. Local clients such as Claude Desktop, Claude Code and Cursor can start it as a process and talk over stdio. Remote clients connect over Streamable HTTP at /mcp, signing in with OAuth 2.1 (claude.ai custom connectors) or a bearer token (custom agents). Local clients can also use the HTTP endpoint. The server executes read-only queries against Db2 for i using the IBM i Access ODBC driver (default, no Java), the optional JT400 JDBC driver (DB2I_DRIVER=jt400), or Mapepire over SSH (DB2I_DRIVER=mapepire) for systems where only SSH is reachable. One server can reach several IBM i systems through connection profiles, each with its own driver.
graph LR
subgraph clients ["AI Clients"]
local("Claude Desktop, Claude Code, Cursor")
remote("claude.ai connectors")
agents("Custom Agents")
end
subgraph server ["MCP Server"]
stdio["stdio"]
http["Streamable HTTP + Auth"]
tools[["MCP Tools"]]
profiles{{"System profiles"}}
odbc["IBM i Access ODBC"]
jdbc["JT400 JDBC (optional)"]
mapepire["Mapepire over SSH (optional)"]
end
subgraph prod ["IBM i: prod"]
db2prod[("Db2 for i")]
end
subgraph test ["IBM i: test"]
db2test[("Db2 for i")]
end
subgraph dev ["IBM i: dev"]
db2dev[("Db2 for i")]
end
local -->|local process| stdio
local -.->|remote URL| http
remote -->|OAuth 2.1| http
agents -->|bearer token| http
stdio & http --> tools
tools --> profiles
profiles --> odbc & jdbc & mapepire
odbc -->|ODBC| db2prod
jdbc -->|JDBC| db2test
mapepire -->|SSH| db2devRelated MCP server: IBM i MCP Server
Features
Read-only SQL queries - Execute SELECT statements safely with automatic result limiting, and a query timeout that cancels runaway statements on the IBM i
Schema inspection - List all schemas/libraries with optional filtering
Table metadata - List tables, describe columns, view indexes and constraints
View inspection - List and explore database views
Secure by design - Only SELECT queries allowed, credentials via environment variables
Docker support - Run as a container for easy deployment
HTTP Transport - MCP over Streamable HTTP with token authentication for remote clients and agents
OAuth for Remote Clients - Built-in OAuth 2.1 sign-in with the user's own IBM i profile, so claude.ai custom connectors can connect. The sign-in page can carry your company's name, logo, colors and language (Customize for your company)
Current MCP spec - Speaks 2026-07-28 and still serves stateless 2025-era clients
Dual Transport - Run stdio and HTTP simultaneously
Multiple systems - Reach several IBM i systems from one server with
DB2I_PROFILES, each with its own driver, credentials, and library allowlist. Tools take an optionalsystemargument. See Multiple systemsSSH-only systems - With
DB2I_DRIVER=mapepire, reach an IBM i where only SSH is open. Mapepire starts inside the SSH session, with no server install and a host key check. See Using the Mapepire driverTool selection - Enable or disable individual tools, e.g. a metadata-only mode without
execute_queryBusiness SQL tools - Load read-only ERP queries and table notes from YAML, and check the files with
mcp-server-db2i validate-toolsbefore the server starts. See Business SQL toolsServer instructions - Send the rules no query may miss, such as which flag marks a deleted row, to the model at the start of every session. See Instructions
Compact responses - Compact JSON by default, or markdown tables to save tokens
Statement checks and DDL - Validate object names, return the SQL that recreates an object, and list what depends on a table
Catalog search and profiling - Find tables and columns across libraries, check journaling, and profile a table's row counts and value ranges
Column masking - Redact sensitive columns, or show only their last four characters, in query results. See Column masking
Query exports - Hand the user a CSV or Excel file of a query's results, as a file path over stdio or a short-lived download link over HTTP. The rows never pass through the model. See Query exports
Audit log - Record every tool call and sign-in as one JSON line, with the SQL hashed by default. Optionally record the model's reason for each call (
MCP_TOOL_INTENT). See Audit logTool reload - Reload YAML tool files when they change, with
MCP_CUSTOM_TOOLS_WATCH=trueResources and prompts - Read table columns and DDL as MCP resources, and start from prompts that explore a library, explain a table, or write a query. See Resources and prompts
Quick Start
Installation
npm install -g mcp-server-db2iThe default odbc driver needs unixODBC and the IBM i Access ODBC Driver on the machine. No Java is needed. The other drivers' packages are not installed by default, so add them next to the server:
npm install -g mcp-server-db2i node-jt400 # DB2I_DRIVER=jt400, needs a JDK to install and a JRE to run
npm install -g mcp-server-db2i @ibm/mapepire-js ssh2 # DB2I_DRIVER=mapepire, when only SSH reaches the IBM iWith npx, pass them with -p, for example npx -y -p mcp-server-db2i@latest -p node-jt400 mcp-server-db2i. See Installing the jt400 and mapepire packages.
Or with Docker:
docker build -t mcp-server-db2i . # odbc image (amd64; add --platform linux/amd64 on arm64)
docker build --target jt400 -t mcp-server-db2i . # jt400 image (builds natively on arm64)Configuration
Create a .env file with your IBM i credentials:
DB2I_HOSTNAME=your-ibm-i-host.com
DB2I_USERNAME=your-username
DB2I_PASSWORD=your-password
DB2I_SCHEMA=your-default-schema # OptionalClient Setup
Add to your MCP client config (e.g., ~/.cursor/mcp.json):
{
"mcpServers": {
"db2i": {
"command": "npx",
"args": ["-y", "mcp-server-db2i@latest"],
"env": {
"DB2I_HOSTNAME": "${env:DB2I_HOSTNAME}",
"DB2I_USERNAME": "${env:DB2I_USERNAME}",
"DB2I_PASSWORD": "${env:DB2I_PASSWORD}"
}
}
}
}This uses environment variable expansion to keep credentials out of config files. Set the variables in your shell profile (~/.zshrc or ~/.bashrc).
See the Client Setup Guide for Cursor, Claude Desktop, Claude Code, and Docker setup options.
Available Tools
Tool | Description |
| Execute read-only SELECT queries |
| Write every row of a read-only query to a CSV or XLSX file: a path over stdio, a short-lived download link over HTTP. Off unless |
| List schemas/libraries (with optional filter) |
| List tables in a schema (with optional filter) |
| Find tables by name or description across libraries |
| Find columns by name or description across libraries |
| Get detailed column information |
| List views in a schema (with optional filter) |
| List SQL indexes for a table |
| Get primary keys, foreign keys, unique constraints |
| List SQL procedures and functions in a library, with language, external program, and SQL data access |
| Parameters, return value or result columns, and a call template for a procedure or function |
| Check a statement without running it, including catalog names |
| Return the SQL DDL that recreates an object |
| List objects that depend on a table |
| List journal, images, and primary key per table, and flag tables a replication tool cannot read |
| List the indexes the query optimizer asked for in a library, merged and ranked by temporary index use |
| Row count, last change, and per-column distinct and null counts from stored statistics or a scan |
| List business descriptions, row filters and relations loaded from YAML |
| Find IBM i services by keyword or category, with the release that added each one and an example query |
Filter Syntax
The list tools support pattern matching:
CUST- Contains "CUST"CUST*- Starts with "CUST"*LOG- Ends with "LOG"
Resources and prompts
Clients that support MCP resources can read a table's context without a tool call, and complete library and table names as you type.
Resource | Contents | Registered when |
| Columns from the catalog, plus the YAML business description, column notes, and relations |
|
| SQL from |
|
| Every annotation loaded from |
|
resources/list offers the annotated tables, for example db2i://MYLIB/ORDERS. Percent-encode # and other reserved characters in names (ORD%23X for ORD#X). A library outside QUERY_ALLOWED_SCHEMAS is rejected with the same message execute_query gives, and completion offers only allowed libraries. Reads and completions that query IBM i count against the rate limit, and reads are written to the audit log. Completion fetches a library's name list once and reuses it for 60 seconds, so typing a name costs one query rather than one per keystroke.
Prompt | Arguments | What it asks for |
|
| List the tables, describe the central ones, and summarize how they join |
|
| Explain rows, columns, keys, and relations in plain language |
|
| Write one SELECT from the table's real columns and YAML relations, then validate and run it when those tools are enabled |
A prompt is listed only when the tools it tells the model to call are enabled: explore_library needs list_tables and describe_table, and the other two need describe_table. None of them asks for a write.
Use cases
I've used this server on projects where the source system was the Iptor DC1 ERP on IBM i. The same patterns work with any IBM i ERP.
Building REST APIs - The agent finds the ERP tables and keys, checks its SQL with
validate_query, tests it on sample rows, and then writes the endpoint.ETL and ELT pipelines for BI - Profile source tables, generate staging DDL with
get_object_ddl, and draft incremental extracts and code mappings for the warehouse.Near-real-time replication to BI - Check which tables are journaled, and with which images, before a journal-based tool such as Fivetran streams changes to the warehouse.
Ad-hoc analysis - Connect Claude or Cursor directly to the ERP and ask business questions in plain language, with vetted Business SQL tools and column masking for sensitive fields.
See Use cases for sample prompts and the guardrails that go with each one.
Example Usage
Once connected, you can ask the AI assistant:
"List all schemas that contain 'PROD'"
"Show me the tables in schema MYLIB"
"Describe the columns in MYLIB/CUSTOMERS"
"What indexes exist on the ORDERS table?"
"Run this query: SELECT * FROM MYLIB.CUSTOMERS WHERE STATUS = 'A'"
"Find the order header and line tables in MYLIB and write a GET /orders/:orderNo endpoint"
"Draft an incremental extract of MYLIB.ORDERHDR rows changed since yesterday"
Documentation
Guide | Description |
Built-in tools, filter syntax, MCP resources, and prompts | |
HTTP API, auth, and protocol versions | |
All environment variables and driver options | |
Credentials, rate limiting, query validation | |
YAML tools for orders, ledgers, and master data | |
REST APIs, BI pipelines, replication, and ad-hoc analysis | |
Cursor, Claude, Claude Code setup | |
Container deployment | |
Contributing and local setup |
Compatibility
IBM i V7R3 and later (V7R5 recommended)
validate_queryand theexecute_queryparse check needQSYS2.PARSE_STATEMENT(IBM i 7.3 with Db2 PTF group SF99703 level 3, or 7.4 and later)get_related_objectsneeds IBM i 7.3 Technology Refresh 9, IBM i 7.4 Technology Refresh 3, or a later releaseget_journal_infoneeds the journal columns ofQSYS2.OBJECT_STATISTICS(IBM i 7.3 Technology Refresh 2 or later)search_ibmi_servicesneedsQSYS2.SERVICES_INFO, which ships with the Db2 for i PTF groupThe
causeandrecoveryon a failed statement come fromSYSTOOLS.SQLCODE_INFO. Without it, errors return the SQLSTATE, SQLCODE and message onlyNode.js 22 or higher
unixODBC with the IBM i Access ODBC Driver for the default
odbcdriver, a JDK at install time and a JRE 11 or higher at runtime for the optionaljt400driver, or SSH access and Java 8 or higher on the IBM i for the optionalmapepiredriver (see Database Drivers)MCP spec 2026-07-28, plus stateless clients from the 2025-era revisions (through 2025-11-25)
Related Projects
IBM ibmi-mcp-server - IBM's official MCP server for IBM i systems. Offers YAML-based SQL tool definitions and AI agent frameworks. Requires Mapepire. This project's
mapepiredriver uses Mapepire's SSH mode, which needs no Mapepire server running on the IBM i.
Contributing
Contributions are welcome! See the Development Guide for setup instructions.
License
MIT License - see LICENSE for details.
Trademarks
IBM, IBM i and Db2 are trademarks of International Business Machines Corporation. This project is not affiliated with or endorsed by IBM.
Acknowledgments
node-jt400 - JT400 JDBC driver wrapper for Node.js
node-odbc - ODBC bindings for Node.js, maintained by IBM
mapepire-js - Mapepire client for Node.js, maintained by IBM
Model Context Protocol - The protocol specification
@modelcontextprotocol/server - Official TypeScript SDK (spec 2026-07-28, with stateless 2025-era clients)
Available Tools
19 toolsdescribe_routineDescribe RoutineARead-onlyIdempotent
Describe an SQL procedure or function from QSYS2.SYSPARMS: parameters in order with mode, data type, and default; the return value of a scalar function; and the result columns of a table function. An overloaded name returns every overload unless specific_name picks one. call_template is a statement with a ? marker per parameter. callable_with_execute_query says whether execute_query can run it: procedures (CALL) and functions that modify SQL data cannot, and note says why. Uses the system's default schema if not provided.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Routine name. Required unless specific_name is given. | |
| schema | No | Schema (library) containing the routine. Uses the system's default schema if not provided. | |
| specific_name | No | Specific name of one overload, from list_routines. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| cause | No | Why the statement failed. &1-style placeholders stand for values in error. |
| count | No | |
| error | No | |
| schema | No | |
| sqlcode | No | SQLCODE of the failed statement, such as -204 |
| success | Yes | |
| recovery | No | What to change before trying again |
| sqlstate | No | SQLSTATE of the failed statement |
| truncated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent/closed-world annotations, it discloses non-obvious behavior: overloaded names return every overload, call_template uses a ? marker per parameter, and procedures (CALL) plus SQL-data-modifying functions cannot be run via execute_query, with note explaining why. That is substantive operating context the annotations do not provide.
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 dense but front-loaded, leading with what it returns before qualifying details. Each clause carries information, though the return-value enumeration is partly redundant given the output schema.
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 3-parameter read tool with an output schema, the description covers everything an agent needs: source catalog, overload semantics, execution eligibility, and default-schema fallback. Nothing required 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 coverage is 100%, so the baseline is 3, but the description adds meaning: the name/specific_name mutual-exclusion rule is restated and default-schema fallback is confirmed. It does not add format or syntax detail beyond that.
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 opens with a specific verb and resource tied to a concrete source (QSYS2.SYSPARMS) and enumerates exactly what is described: parameter mode/type/default, scalar return value, and table-function result columns. This clearly separates it from describe_table and list_routines.
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?
It states when the overload behavior applies ('An overloaded name returns every overload unless specific_name picks one') and routes execution decisions to callable_with_execute_query, naming execute_query as the related sibling. It stops short of explicitly saying to call list_routines first to obtain a specific_name, though the schema hints at it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_tableDescribe TableARead-onlyIdempotent
Get detailed column information for a specific table including data types, lengths, nullability, defaults, and CCSID. Uses the system's default schema if not provided.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Table name to describe | |
| schema | No | Schema (library) name containing the table. Uses the system's default schema if not provided. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| count | No | |
| error | No | |
| filters | No | Row filters most queries on this table need, such as leaving out deleted rows |
| success | Yes | |
| relations | No | |
| business_description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description usefully adds the default-schema fallback and the fact that CCSID metadata is included, but says nothing about failure modes (e.g., unknown table/schema) or result shape, and an output schema exists anyway.
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 front-loaded sentences with no filler: the purpose and returned attributes come first, then the schema-default caveat. Slightly list-heavy, but every clause carries information.
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 read tool with full schema coverage, an output schema, and annotations covering the safety profile, the definition is nearly complete. It could still note that the table must already exist or how a missing schema resolves, but no critical invocation detail 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% and both parameters (table, schema) are already documented in the schema, including the same default-schema note. The description adds no format, qualification, or naming-convention detail beyond what the structured fields provide, so baseline 3 applies.
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 ('detailed column information for a specific table') and enumerates the returned attributes (data types, lengths, nullability, defaults, CCSID), which clearly separates it from siblings like list_tables, get_object_ddl, or get_table_constraints.
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 implies the use case (inspecting one table's column structure) but never states when to prefer this over get_object_ddl, search_columns, or list_tables, nor any conditions or exclusions. The only guidance given is the default-schema fallback behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
execute_queryExecute SQL QueryBRead-onlyIdempotent
Execute a read-only SQL SELECT query against the IBM Db2i database. Only SELECT statements are allowed for security. Results are limited by default to prevent large result sets.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | SQL SELECT query to execute | |
| limit | No | Maximum number of rows to return (default: QUERY_DEFAULT_LIMIT, max: QUERY_MAX_LIMIT) | |
| params | No | Query parameters for prepared statement |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| cause | No | Why the statement failed. &1-style placeholders stand for values in error. |
| error | No | |
| sqlcode | No | SQLCODE of the failed statement, such as -204 |
| success | Yes | |
| recovery | No | What to change before trying again |
| rowCount | No | |
| sqlstate | No | SQLSTATE of the failed statement |
| warnings | No | Tell the user these, such as columns the driver rounded |
| truncated | No | True when the result stopped at limitApplied and more rows match |
| violations | No | |
| limitApplied | No | |
| skippedFilters | No | Annotated tables whose row filter, such as leaving out deleted rows, the query does not use. See warnings |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered structurally. The description adds two useful behavioral facts beyond the annotations: the SELECT-only security restriction and that result sets are capped by default. It does not disclose the actual default limit value, failure behavior, or timeout characteristics.
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?
Three short sentences, front-loaded with the core action and immediately followed by the key constraint. Every sentence carries information, though the final sentence is slightly redundant with the limit parameter already described in the schema.
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?
An output schema exists, so return-value explanation is not required. However, for a query-execution tool surrounded by validate_query and schema-introspection siblings, the description omits error-handling expectations and any guidance on validating queries first, leaving minor gaps for correct invocation in a workflow.
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 sql, limit, and params are already documented in the schema, which sets the baseline at 3. The description adds only marginal meaning for 'limit' by noting results are limited by default, but it does not explain parameter binding syntax for 'params' or the practical impact of the default cap.
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 ('Execute a read-only SQL SELECT query against the IBM Db2i database'), making the operation instantly recognizable. It does not, however, explicitly distinguish itself from the sibling validate_query, which an agent might reasonably consider for the same SQL text.
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?
It implies usage through the constraint 'Only SELECT statements are allowed for security,' which tells the agent this is for querying rather than DDL/DML. There is no explicit when-to-use clause and no mention of when to prefer validate_query, list_tables, or search_tables instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_business_contextGet Business ContextARead-onlyIdempotent
List business entities, row filters most queries need (such as leaving out deleted rows), table and column descriptions, and relations that the catalog does not declare as foreign keys. Filter by entity or table. Omit both to return every annotation loaded from MCP_CUSTOM_TOOLS. An unknown entity name falls back to names that partly match it, and when nothing matches, the result lists the loaded entity names.
| Name | Required | Description | Default |
|---|---|---|---|
| table | No | Table name, or SCHEMA.TABLE | |
| entity | No | Entity name, for example sales_order |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| hint | No | What to call next when the filters did not match exactly |
| count | No | |
| error | No | |
| success | Yes | |
| partial_match | No | True when no entity had the requested name and data holds entities whose names partly match it |
| available_tables | No | Every annotated SCHEMA.TABLE, when the table filter matched nothing |
| available_entities | No | Every loaded entity name, when nothing matched the filters |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive). The description adds genuinely useful behavior beyond them: the MCP_CUSTOM_TOOLS data source, fuzzy fallback on unknown entity names, and the empty-result fallback that lists loaded entity names. It does not cover output shape, but an output schema exists.
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?
Front-loaded with what is returned, then filtering, then edge-case behavior. It is information-dense and every sentence carries weight, though the first sentence is a long run-on list that could be tightened slightly.
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 an output schema present, return values need not be described, and the description covers source, filtering, and fallback behavior adequately for a 2-param read-only lookup. Only the explicit sibling-routing guidance 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 coverage is 100%, so the baseline is 3, but the description earns extra credit by explaining the interaction between the two params: filter by either entity or table, omit both to return everything, and unknown entity names trigger partial matching rather than failure.
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 (List) and enumerates the resource types returned: business entities, row filters, table/column descriptions, and non-FK relations. The phrase 'relations that the catalog does not declare as foreign keys' implicitly distinguishes it from get_table_constraints, though it does not name that sibling outright.
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 implied rather than stated — 'row filters most queries need' hints it belongs in query-construction workflows, and the filter/omit semantics are explained. But it never says when to prefer this over describe_table, get_table_constraints, or get_related_objects, so the agent must infer the boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_journal_infoGet Journal InfoARead-onlyIdempotent
List the physical data files in a library with their journal, journal library, journal images, omitted entries, and whether they have a primary key, using QSYS2.OBJECT_STATISTICS. needs_attention is true when a table is not journaled, or has no primary key and does not journal both images, which journal-based replication tools need. Requires IBM i 7.3 Technology Refresh 2 or later.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows to return. Capped by QUERY_MAX_LIMIT. | |
| filter | No | Filter pattern for table names. Use * as wildcard. Example: "ORDER*" matches tables starting with ORDER | |
| schema | No | Schema (library) to inspect. Uses the system's default schema if not provided. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| count | No | |
| error | No | |
| schema | No | |
| success | Yes | |
| truncated | No | |
| needsAttention | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it as a safe, idempotent read (readOnlyHint, idempotentHint, destructiveHint: false, openWorldHint: false). The description adds valuable context beyond that: it explains the computed 'needs_attention' flag, what conditions set it, and why it matters (journal-based replication). It also notes the OS version requirement, which is a meaningful operational constraint.
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?
Three sentences, front-loaded with the core purpose. Every sentence earns its place: the first describes the output, the second explains the needs_attention flag, and the third states the version requirement. No redundancy.
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?
An output schema exists, so return values need not be explained. Annotations cover the safety profile. The description provides the necessary domain context (what needs_attention means, replication use case, IBM i version) and the underlying API, making it complete for correct invocation.
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 fully documents the three parameters (limit, filter, schema). The description adds no parameter-level syntax or format details. Baseline 3 is appropriate when the schema does the heavy lifting.
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 and resource: 'List the physical data files... with their journal...'. It names the underlying IBM i API (QSYS2.OBJECT_STATISTICS) and the exact fields returned. It doesn't explicitly differentiate from siblings like list_tables or describe_table, but the domain specificity is high.
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 explains the semantics of needs_attention and its relevance to 'journal-based replication tools', which implies a use case. However, it doesn't state when to use this tool versus alternatives like list_tables or describe_table, nor does it mention exclusions or prerequisites beyond the OS version.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_object_ddlGet Object DDLARead-onlyIdempotent
Return the SQL DDL that recreates a database object, using QSYS2.GENERATE_SQL. Does not run the generated statements. Requires IBM i 7.3 or later.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Object type: TABLE, VIEW, INDEX, ALIAS, TRIGGER, FUNCTION, PROCEDURE, or SEQUENCE | |
| object | Yes | Object name | |
| schema | No | Schema (library) that contains the object. Uses the system's default schema if not provided. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ddl | No | |
| type | No | |
| error | No | |
| object | No | |
| schema | No | |
| success | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavioral context beyond that: the output is DDL only and is not executed, and it carries a platform version requirement (IBM i 7.3+).
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?
Three short, front-loaded sentences with no filler. The core action comes first, then the non-execution caveat, then the version requirement.
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?
An output schema exists, so return values need no explanation, and annotations cover the safety profile. The description supplies the mechanism and version prerequisite; only the routing against sibling tools is absent, which is a minor gap for this fairly self-contained tool.
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 an enum on 'type' and clear text on 'object' and 'schema', so the schema does the heavy lifting. The description adds no parameter detail (e.g., format of 'object', qualified name handling), matching the baseline 3 when coverage is complete.
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: return the SQL DDL that recreates a database object, and names the underlying mechanism (QSYS2.GENERATE_SQL). This is clearly distinct from metadata-oriented siblings like describe_table, though no sibling is named explicitly to sharpen the contrast.
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?
It implies usage via a behavioral caveat ('Does not run the generated statements') and a version prerequisite ('Requires IBM i 7.3 or later'), but never states when to choose this over describe_table or execute_query, nor any explicit exclusions. Adequate context, but no alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_table_constraintsGet Table ConstraintsBRead-onlyIdempotent
Get all constraints (primary keys, foreign keys, unique constraints) for a specific table. Uses the system's default schema if not provided.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Table name to get constraints for | |
| schema | No | Schema (library) name containing the table. Uses the system's default schema if not provided. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| count | No | |
| error | No | |
| success | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=false, and destructiveHint=false, so the safety profile is fully covered by structured data. The only extra behavioral fact the description offers, the default-schema fallback, is duplicated verbatim in the schema, and there is no output schema explanation needed since one exists. A 3 reflects modest added value over annotations.
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 short sentences, front-loaded with the core action and the return contents, with the schema-default caveat last. No filler or redundancy beyond the minor overlap with the schema text.
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 annotations covering safety, an output schema covering return values, and 100% schema description coverage on both parameters, the description is sufficient for correct invocation. The only omission is disambiguation from sibling metadata tools, which keeps it from a 5.
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 both parameters ('table' and 'schema') are fully documented in the schema. The description's mention of the default schema fallback restates the schema's own wording rather than adding format, casing, or qualification semantics. Baseline 3 is appropriate.
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 uses a specific verb and resource ('Get all constraints ... for a specific table') and enumerates the constraint types returned (primary keys, foreign keys, unique constraints), so an agent knows exactly what this returns. It does not differentiate itself from adjacent siblings like list_indexes or describe_table, which also expose table metadata, so it stops short of a 5.
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 explicit when-to-use guidance, no prerequisites, and no named alternative. The implied context (you need constraint metadata for one table) is inferable from the sibling list, but the description itself does not route the agent between get_table_constraints, describe_table, and list_indexes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
index_adviceIndex AdviceARead-onlyIdempotent
List the indexes the query optimizer asked for on the tables of a library, from the IBM i index advisor (QSYS2.SYSIXADV). Rows with the same table, key columns, and index type are merged into one, with counts summed and reason codes described. Sorted by mti_used, then times_advised: advice where the optimizer kept building and reusing a maintained temporary index (MTI) is the strongest signal. key_columns are in CREATE INDEX order and can end in DESC. last_advised and since are in the system's local time. This tool only reads the advice; it does not create indexes.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows to return. Capped by QUERY_MAX_LIMIT. | |
| since | No | Only advice last given on or after this date or timestamp, in the IBM i system's local time with no time zone. Example: "2026-01-31" or "2026-01-31 08:00:00" | |
| table | No | Table name. Omit for every table in the library. | |
| schema | No | Schema (library) whose tables to read advice for. Uses the system's default schema if not provided. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| cause | No | Why the statement failed. &1-style placeholders stand for values in error. |
| count | No | |
| error | No | |
| since | No | |
| table | No | |
| schema | No | |
| sqlcode | No | SQLCODE of the failed statement, such as -204 |
| success | Yes | |
| recovery | No | What to change before trying again |
| sqlstate | No | SQLSTATE of the failed statement |
| truncated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description goes well beyond them: it discloses row-merging behavior with summed counts, sort order (mti_used then times_advised), CREATE INDEX column ordering with possible DESC suffix, local-time semantics for last_advised/since, and the explicit constraint that no indexes are created. This is exactly the behavioral context an agent needs.
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?
Front-loaded with purpose, then ordered into aggregation, sorting, column format, time semantics, and the read-only guarantee. Dense but every sentence adds distinct information; only the time-zone sentence is arguably redundant with the schema.
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 an output schema present, return values need not be explained, yet the description still usefully characterizes the shape of results (merged rows, reason codes, sort order) and the read-only scope. Scope, filters, and interpretation are covered; only explicit sibling routing 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%, so all four parameters are already documented in the schema, including the local-time format for 'since' and the limit cap. The description's remark that last_advised and since are in system local time largely restates the schema, adding no syntax or format detail beyond it, so the baseline 3 applies.
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 and resource ('List the indexes the query optimizer asked for... from the IBM i index advisor (QSYS2.SYSIXADV)') and distinguishes itself from siblings like list_indexes by making clear this is advisor output, not actual index definitions. An agent can tell exactly what it returns without opening the schema.
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 implied rather than stated: the tool is for inspecting optimizer advice before creating indexes, and the description helps interpret results ('advice where the optimizer kept building and reusing an MTI is the strongest signal'). However, it never names an alternative sibling (e.g. list_indexes) or an explicit when-not condition, so routing guidance is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_indexesList IndexesBRead-onlyIdempotent
List all indexes for a specific table including uniqueness and column information. Uses the system's default schema if not provided.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Table name to list indexes for | |
| schema | No | Schema (library) name containing the table. Uses the system's default schema if not provided. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| count | No | |
| error | No | |
| success | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The description adds only what the listing contains (uniqueness, column info), which is largely redundant with the existing 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?
Two short sentences, front-loaded with the core action. Nothing is padded or repeated, and the secondary default-schema note is appropriately placed at the end.
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 listing tool with full annotation coverage, a complete output schema, and fully documented parameters, the description is essentially sufficient. It omits any hint about result size or indexing edge cases, but nothing required to invoke it correctly 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%, so both parameters are already documented in the schema. The description's note about the default schema duplicates the schema text for the 'schema' parameter and adds no new syntax or format detail, so the baseline 3 applies.
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 and resource ('List all indexes for a specific table') plus the scope of returned fields (uniqueness, column information). It is clearly distinct from siblings like describe_table or get_table_constraints, though it does not name an alternative explicitly.
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 never says when to prefer this tool over siblings such as get_table_constraints or describe_table, nor does it give any exclusions. The only conditional statement concerns the optional schema parameter's default, which is usage of a parameter rather than guidance on tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_routinesList RoutinesARead-onlyIdempotent
List SQL procedures and functions in a library from QSYS2.SYSROUTINES, one row per specific routine, so overloads appear once each. Shows the type (procedure, scalar function, or table function), language, external program, SQL data access, result sets, and text. Use describe_routine for parameters and a call template. Uses the system's default schema if not provided.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Only procedures or only functions. Omit for both. | |
| limit | No | Maximum routines to return. Capped by QUERY_MAX_LIMIT. | |
| filter | No | Filter routine names. Use * as wildcard, e.g. "GET*". Without a wildcard, matches names containing the text. | |
| schema | No | Schema (library) to list routines in. Uses the system's default schema if not provided. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| cause | No | Why the statement failed. &1-style placeholders stand for values in error. |
| count | No | |
| error | No | |
| schema | No | |
| sqlcode | No | SQLCODE of the failed statement, such as -204 |
| success | Yes | |
| recovery | No | What to change before trying again |
| sqlstate | No | SQLSTATE of the failed statement |
| truncated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so safety is covered. Beyond that, the description adds real behavioral detail: it documents the deduplication semantics for overloads and enumerates the returned attributes (type, language, external program, SQL data access, result sets, text). It omits the limit/QUERY_MAX_LIMIT behavior, leaving that to the 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?
Front-loaded with the purpose and the source view, then the dedup rule and the routing hint. The column enumeration in sentence two is somewhat list-heavy but still informative rather than filler. No wasted preamble.
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?
An output schema exists, so return values need no further explanation, and annotations carry the safety profile. Combined with the schema's full parameter documentation, the description supplies everything an agent needs to select and call this tool correctly.
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 documents type, limit, filter, and schema thoroughly. The description restates only the default-schema behavior, adding no syntax or filter-format guidance beyond what the schema provides. Baseline 3 is appropriate.
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 ('List SQL procedures and functions in a library') and anchors it to its source (QSYS2.SYSROUTINES), with the notable qualifier 'one row per specific routine, so overloads appear once each'. That granularity lets an agent distinguish it from list_tables, list_views, and describe_routine without opening a schema.
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?
It explicitly routes complementary work elsewhere: 'Use describe_routine for parameters and a call template', which tells the agent when this tool is insufficient. It also clarifies the default-schema fallback. It does not, however, state exclusions or contrast against sibling listing tools such as search_ibmi_services.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_schemasList SchemasARead-onlyIdempotent
List all schemas (libraries) in the IBM Db2i database. Optionally filter by name pattern using * as wildcard.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Filter pattern for schema names. Use * as wildcard. Example: "QSYS*" matches schemas starting with QSYS |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| count | No | |
| error | No | |
| success | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety and repeatability profile is fully covered by structured data. The description adds the (libraries) terminology mapping, which is useful context, but nothing about result scope or limits beyond what annotations provide. With annotations carrying the behavioral burden, a 3 is appropriate.
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, zero waste, and the core action is front-loaded before the optional filter detail. Every clause 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 zero-required-parameter listing tool with rich annotations and an output schema, the description covers purpose, scope, and the only parameter's behavior. Nothing an agent needs to call it correctly 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% and the filter parameter is fully documented in the schema, including the wildcard syntax and an example. The description restates the wildcard behavior in one clause without adding format or edge-case detail beyond the schema. Baseline 3 is correct when the schema does the heavy lifting.
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 (List) and resource (schemas/libraries) in a named database, and the parenthetical 'libraries' disambiguates the Db2 for i terminology. An agent can distinguish this from list_tables or list_views without opening any schema.
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 optional filter usage is stated ('Optionally filter by name pattern'), which implies when the parameter applies, but there is no explicit when-to-use versus siblings or when-not-to-use guidance. For an inventory-listing tool the usage context is largely self-evident, so this is adequate but not rich.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tablesList TablesBRead-onlyIdempotent
List all tables in a schema (library). Uses the system's default schema if not provided. Optionally filter by name pattern using * as wildcard.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Filter pattern for table names. Use * as wildcard. Example: "CUST*" matches tables starting with CUST | |
| schema | No | Schema (library) name to list tables from. Uses the system's default schema if not provided. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| count | No | |
| error | No | |
| success | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered. The description's only added behavioral fact is the default-schema fallback; it says nothing about empty results, case sensitivity of the wildcard, or limits, so it adds modest value only.
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?
Three short sentences, front-loaded with the primary action and scope. Slight redundancy with the schema text on the wildcard and default schema, but overall efficient and easy to scan.
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 an output schema present and full annotation coverage, the description need not explain return values, and it adequately covers invocation for a two-optional-param list tool. The only gap is disambiguation from search_tables, which is a routing concern the description should have closed.
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 (filter, schema) are already documented in the schema, including the wildcard example and default behavior. The description merely restates that the filter uses * and that schema defaults, adding no new syntax or constraint 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 and resource (list tables) with scope (in a schema/library) and the default-schema fallback. However, it does not differentiate itself from the sibling search_tables, which also filters tables by name pattern, so an agent cannot cleanly choose between them from this text alone.
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?
It mentions that the default schema is used when none is supplied, which is helpful context, but gives no explicit when-to-use guidance and no exclusion or alternative pointing toward search_tables, list_schemas, or describe_table. The overlap with search_tables is left unresolved.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_viewsList ViewsARead-onlyIdempotent
List all views in a schema (library). Uses the system's default schema if not provided. Optionally filter by name pattern using * as wildcard.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Filter pattern for view names. Use * as wildcard. | |
| schema | No | Schema (library) name to list views from. Uses the system's default schema if not provided. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| count | No | |
| error | No | |
| success | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds that an unspecified schema falls back to a system default and that the filter supports wildcards, but discloses nothing beyond that (e.g. result cap or ordering).
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 core action front-loaded; nothing is wasted. The default-schema and wildcard details are secondary but relevant, so minor trimming room remains rather than excess.
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?
An output schema exists, so return values need no explanation, and both optional parameters are fully documented. For a simple read-only list tool with annotations covering safety, this is essentially complete, with only cross-tool routing left unaddressed.
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 both parameters are already documented in the schema. The description restates the wildcard filter and default-schema behavior rather than adding new format or constraint details, so the baseline of 3 applies.
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 and resource — 'List all views in a schema (library)' — so an agent knows exactly what object type is returned. It does not explicitly distinguish itself from siblings like list_tables or list_schemas, but the resource noun makes the separation obvious from name alone.
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 implied (call it to enumerate views) but there is no explicit when-to-use guidance or routing to an alternative. It also never says when not to use it, e.g. versus search_tables or describe_table, so the agent must infer the boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
profile_tableProfile TableARead-onlyIdempotent
Profile a table for ETL work: row count, deleted rows, size, and last change from QSYS2.SYSTABLESTAT, plus per-column distinct count, null count, and low and high values. By default column numbers come from stored statistics in QSYS2.SYSCOLUMNSTAT (low and high are the second-lowest and second-highest values), and columns without collected statistics report source "none". Set compute to true to scan the table for exact numbers on up to 20 columns. Masked columns keep their counts and return no values.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Table name | |
| schema | No | Schema (library) that contains the table. Uses the system's default schema if not provided. | |
| columns | No | Columns to profile. Defaults to every column (the first 20 when compute is true). | |
| compute | No | Scan the table for exact counts, MIN, and MAX. Slower on large tables. Default false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| sql | No | |
| data | No | |
| mode | No | |
| cause | No | Why the statement failed. &1-style placeholders stand for values in error. |
| count | No | |
| error | No | |
| table | No | |
| schema | No | |
| sqlcode | No | SQLCODE of the failed statement, such as -204 |
| success | Yes | |
| recovery | No | What to change before trying again |
| sqlstate | No | SQLSTATE of the failed statement |
| truncated | No | |
| table_stats | No | |
| computed_rows | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish this is a safe, idempotent read, and the description layers on substantial extra context: the source system tables, that low/high are the second-lowest/second-highest values, that unstatted columns report source "none", that masked columns return counts but no values, and the compute row-scan cost. These are exactly the non-obvious behaviors an agent needs before invoking.
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?
Three dense sentences, each carrying distinct information (what is profiled, default source, compute opt-in, masking). It is front-loaded with the deliverable and wastes little, though the second sentence is long and packs several ideas that could be split for faster scanning.
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 an output schema present, the description need not explain return values, and it instead covers the behavioral gaps: data sources, stats staleness semantics, masking, and compute limits. For a profiling tool with subtle stat-based defaults, nothing an agent needs to call it correctly 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 coverage is 100%, so the baseline is 3, but the description adds meaning the schema does not: compute's 20-column ceiling, that the default column set is every column vs. the first 20 under compute, and the masking behavior that affects which parameters yield values. It stops short of documenting the schema parameter's fallback beyond what the schema already says.
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 opens with a specific verb+resource ("Profile a table for ETL work") and enumerates exactly what is produced: row count, deleted rows, size, last change, and per-column distinct/null/low/high values. This is far more informative than a tautology, though it never names or contrasts itself with the closest sibling, describe_table, which an agent may consider a substitute.
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?
It clearly states the default behavior (stats from SYSCOLUMNSTAT) and the condition that changes it ("Set compute to true to scan the table for exact numbers"), including the cost tradeoff ("Slower on large tables") and the 20-column cap. There is no explicit when-not or named alternative, but the context for choosing compute is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_columnsSearch ColumnsARead-onlyIdempotent
Find columns by name or description text across libraries. Matches COLUMN_NAME, SYSTEM_COLUMN_NAME, and COLUMN_TEXT. Use * as a wildcard. When a schema allowlist is configured, only those libraries are searched. Otherwise system libraries (Q* and SYS*) are skipped unless include_system is true.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows to return. Capped by QUERY_MAX_LIMIT. | |
| filter | Yes | Name or text to match. Use * as a wildcard. Example: "ITEM*" matches columns starting with ITEM | |
| schema | No | Limit the search to one library. Must be in the schema allowlist when one is configured. | |
| include_system | No | Include Q* and SYS* libraries. Ignored when a schema or a schema allowlist is set. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| count | No | |
| error | No | |
| success | Yes | |
| truncated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/closed-world, so safety is covered. The description adds non-obvious scoping behavior — allowlist narrowing and implicit system-library exclusion — which an agent could not infer from the annotations or 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?
Four tight sentences, front-loaded with the core action and matching fields, then the scoping rules. No filler, though the allowlist/system behavior is stated twice in compressed form and could be slightly tighter.
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?
An output schema exists, so return values need no explanation. The description covers matching semantics, wildcard, default scope, and allowlist behavior — everything needed to call this correctly.
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 every parameter is already documented in the schema, including wildcard usage and the include_system/allowlist interaction. The description largely restates this, adding little syntax or format detail beyond the schema, so the baseline of 3 is appropriate.
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 (find/search) and resource (columns) plus the matching fields (COLUMN_NAME, SYSTEM_COLUMN_NAME, COLUMN_TEXT) and the cross-library scope. This clearly separates it from the sibling search_tables, which an agent could otherwise confuse with a table lookup.
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?
Gives concrete operating context: wildcard syntax, the allowlist constraint, and the default of skipping Q*/SYS* libraries unless include_system is true. It does not explicitly name a sibling alternative or say when NOT to use it, but the conditions for correct use are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_ibmi_servicesSearch IBM i ServicesARead-onlyIdempotent
Find IBM i SQL services (views, table functions, procedures, and more in QSYS2 and SYSTOOLS) in the catalog QSYS2.SERVICES_INFO, with the release that added each one and an example query. Call it before writing SQL that uses an IBM i service, instead of guessing names and parameters. With no query and no category, it lists the categories with a count each. This tool only reads the catalog. Running an example with execute_query still needs the IBM i authority the service documents and, when QUERY_ALLOWED_SCHEMAS is set, the service's schema in that list. Table functions must be qualified, as in TABLE(QSYS2.ACTIVE_JOB_INFO(DETAILED_INFO => 'NONE')), with plain values as arguments.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum services to return. Capped by QUERY_MAX_LIMIT. | |
| query | No | Keywords, all of which must appear in the service name or category (case-insensitive). Example: "journal entries" | |
| category | No | Exact category, such as JOURNAL, SECURITY, or WORK MANAGEMENT. Call with no arguments to list them. | |
| include_example | No | Include the example query for each service. Default true. | |
| search_examples | No | Also match keywords against the example queries. Default false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| count | No | |
| error | No | |
| success | Yes | |
| truncated | No | |
| categories | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint true and destructiveHint false, but the description adds that the tool only reads the catalog and explains downstream authority and schema constraints when running returned examples via execute_query. It also notes that table functions must be qualified, which is useful behavioral context beyond the annotations.
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 front-loads the core purpose, then layers in usage guidance, fallback behavior, and caveats. It is dense and mostly earns its sentences, though the downstream execute_query and qualification details make it longer than strictly necessary for a search tool.
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?
An output schema exists, so the description need not explain return values. It covers the catalog source, the included metadata, the zero-argument behavior, and relevant caveats for using the returned examples, making it complete for an agent to call the tool correctly.
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 input schema already documents all five parameters in detail. The description adds only a small amount of parameter-interaction context, such as what happens with no query and no category, which does not materially exceed 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?
States a specific verb and resource: 'Find IBM i SQL services (views, table functions, procedures, and more...)' in the named catalog QSYS2.SERVICES_INFO. It also clarifies the context of use before writing SQL that uses an IBM i service, which helps distinguish it from generic query or metadata tools.
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?
Gives clear when-to-use guidance: call it before writing SQL that uses an IBM i service instead of guessing names and parameters. It also describes the no-argument fallback behavior. It does not name alternative sibling tools for related metadata searches, so it stops short of full when-not/alternatives coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_tablesSearch TablesARead-onlyIdempotent
Find tables by name or description text across libraries. Matches TABLE_NAME, SYSTEM_TABLE_NAME, and TABLE_TEXT. Use * as a wildcard. When a schema allowlist is configured, only those libraries are searched. Otherwise system libraries (Q* and SYS*) are skipped unless include_system is true.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows to return. Capped by QUERY_MAX_LIMIT. | |
| filter | Yes | Name or text to match. Use * as a wildcard. Example: "ORDER*" matches tables starting with ORDER | |
| schema | No | Limit the search to one library. Must be in the schema allowlist when one is configured. | |
| include_system | No | Include Q* and SYS* libraries. Ignored when a schema or a schema allowlist is set. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| count | No | |
| error | No | |
| success | Yes | |
| truncated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds genuinely new behavioral context: the schema allowlist restricts which libraries are searched, and Q*/SYS* libraries are skipped by default — scope behavior the annotations cannot convey.
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?
Three front-loaded sentences with no filler: purpose, match targets, then wildcard syntax and scope rules. Dense and efficient, though the scope sentence could be tightened.
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?
An output schema exists, so return values need not be explained, and the description adequately covers search scope and system-library handling. The only real gap is the missing routing against list_tables, which leaves a sibling-selection ambiguity for the agent.
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 all four parameters are already documented in the schema, including wildcard syntax and the include_system interdependency. The description restates the allowlist/system rules without adding syntax or format detail beyond what the schema provides, so the baseline of 3 applies.
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 clear verb+resource ('Find tables') and names the specific match surfaces (TABLE_NAME, SYSTEM_TABLE_NAME, TABLE_TEXT), which is more precise than the name alone. It does not explicitly distinguish itself from the close sibling list_tables, so an agent must infer that this is the filtered variant.
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 explains search scope behavior (allowlist, system-library skipping) which implies when results are constrained, but it never says when to prefer this over list_tables or search_columns. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_queryValidate SQL QueryARead-onlyIdempotent
Check a SQL statement without running it. Parses it with QSYS2.PARSE_STATEMENT and checks that referenced tables, columns, and qualified routines exist in the catalog. Also reports read-only and schema-allowlist findings.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | SQL statement to validate. It is not executed. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cause | No | Why the statement failed. &1-style placeholders stand for values in error. |
| error | No | |
| valid | No | |
| sqlcode | No | SQLCODE of the failed statement, such as -204 |
| success | Yes | |
| recovery | No | What to change before trying again |
| sqlstate | No | SQLSTATE of the failed statement |
| warnings | No | |
| violations | No | |
| missingTables | No | |
| statementType | No | |
| missingColumns | No | |
| skippedFilters | No | Annotated tables whose row filter, such as leaving out deleted rows, the query does not use. See warnings |
| missingRoutines | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, non-destructive, closed-world behavior, so the bar is lower. The description adds meaningful mechanics beyond that: parsing via QSYS2.PARSE_STATEMENT, catalog resolution of tables/columns/routines, and that read-only and schema-allowlist findings are reported.
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, front-loaded with the core action and the non-execution guarantee before the implementation detail. Every clause earns its place with no redundancy.
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?
An output schema exists, so return-value explanation is unnecessary, and the description covers the action, the mechanism, the checks performed, and the non-execution guarantee. Nothing an agent needs to call it correctly 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?
With a single parameter at 100% schema description coverage, the schema already carries the semantics. The description reinforces that the statement is not executed, which mirrors the schema text rather than adding new meaning, so the baseline 3 applies.
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 ('Check a SQL statement') plus the crucial scoping constraint 'without running it', and explains the mechanism (QSYS2.PARSE_STATEMENT plus catalog existence checks). This clearly separates it from the sibling execute_query, which actually runs SQL.
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?
'without running it' implicitly tells the agent to use this before execute_query, and the enumeration of checks makes the intended use case clear. It stops short of explicitly naming execute_query as the alternative or stating when validation is mandatory, so it is clear context rather than full routing guidance.
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.
4 tool updates
v3.5.0- Changed
describe_table1 field changed- added
Output schema / properties / filtersAdded value: +{ + "description": "Row filters most queries on this table need, such as leaving out deleted rows", + "items": { + "additionalProperties": false, + "properties": { + "columns": { + "items": { + "type": "string" + }, + "type": "array" + }, + "reason": { + "type": "string" + }, + "sql": { + "type": "string" + } + }, + "required": [ + "sql", + "columns" + ], + "type": "object" + }, + "type": "array" +}
- Changed
execute_query2 fields changed- added
Output schema / properties / skippedFiltersAdded value: +{ + "description": "Annotated tables whose row filter, such as leaving out deleted rows, the query does not use. See warnings", + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when the result stopped at limitApplied and more rows match", + "type": "boolean" +}
- Changed
get_business_context5 fields changed- added
Output schema / properties / available_entitiesAdded value: +{ + "description": "Every loaded entity name, when nothing matched the filters", + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / available_tablesAdded value: +{ + "description": "Every annotated SCHEMA.TABLE, when the table filter matched nothing", + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / data / items / properties / filtersAdded value: +{ + "description": "Row filters most queries on this table need, such as leaving out deleted rows", + "items": { + "additionalProperties": false, + "properties": { + "columns": { + "items": { + "type": "string" + }, + "type": "array" + }, + "reason": { + "type": "string" + }, + "sql": { + "type": "string" + } + }, + "required": [ + "sql", + "columns" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / hintAdded value: +{ + "description": "What to call next when the filters did not match exactly", + "type": "string" +} - added
Output schema / properties / partial_matchAdded value: +{ + "description": "True when no entity had the requested name and data holds entities whose names partly match it", + "type": "boolean" +}
- Changed
validate_query2 fields changed- added
Output schema / properties / skippedFiltersAdded value: +{ + "description": "Annotated tables whose row filter, such as leaving out deleted rows, the query does not use. See warnings", + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / warningsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +}
19 tool updates
v3.0.0- First observed
describe_routine - First observed
describe_table - First observed
execute_query - First observed
get_business_context - First observed
get_journal_info - First observed
get_object_ddl - First observed
get_related_objects - First observed
get_table_constraints - First observed
index_advice - First observed
list_indexes - First observed
list_routines - First observed
list_schemas - First observed
list_tables - First observed
list_views - First observed
profile_table - First observed
search_columns - First observed
search_ibmi_services - First observed
search_tables - First observed
validate_query
TDQS
Scored across 19 tools
Most tools target clearly distinct resources or actions, such as list_tables vs list_views vs list_routines. A few overlaps exist between list_tables/search_tables, describe_table/search_columns, and list_indexes/get_related_objects/index_advice, but the descriptions generally explain the boundaries enough for correct selection.
Names are overwhelmingly consistent snake_case with predictable verb_noun patterns like list_tables, describe_table, search_columns, and get_table_constraints. The main minor deviation is index_advice, which is noun-only rather than using a list_/get_ verb.
19 tools is slightly above the typical sweet spot, but the breadth reflects genuinely different DB2 for i metadata and query-assistance needs. Each tool appears to map to a concrete catalog, service, or query operation rather than duplicating another tool.
The set covers a strong read-only lifecycle: schemas, tables, views, routines, columns, constraints, indexes, DDL, journaling, profiling, validation, and business context. Gaps remain around explain-plan tooling, explicit trigger/view listing, and any write/DDL execution, though the server appears deliberately read-only.
Maintenance
Related MCP Connectors
Safe, read-only Postgres and MySQL access for AI agents. Audit log + column-level controls.
- dataOAuthco.thinair
PostgreSQL, MySQL, and SQL Server in one session. 26 read-only MCP tools for AI agents.
Query 40 databases from Claude, ChatGPT, or Cursor — on any device. Read-only, encrypted, audited.
Explore, query, and inspect SQLite databases with ease. List tables, preview results, and view det…
Related MCP Servers
AlicenseNot gradedqualityCmaintenanceEnables AI agents to interact with IBM i systems through SQL tools and commands, supporting secure authentication, system monitoring, and database operations via the Model Context Protocol.85Apache 2.0- AlicenseNot gradedqualityCmaintenanceEnables AI agents to interact with IBM i systems through the Model Context Protocol, providing secure SQL-based access to Db2 for i databases for querying, monitoring, and executing operations.Apache 2.0
- AlicenseNot gradedqualityCmaintenanceEnables read-only interaction with IBM DB2 databases, including listing tables and retrieving table metadata.2MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to securely interact with IBM i (AS/400) systems via ODBC, supporting SQL queries, CL commands, source code reading, compilation, and spoolfile analysis.2MIT