odsbox-jaquel-mcp
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., "@odsbox-jaquel-mcpquery all AoMeasurement with channel 'Speed'"
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.
ASAM ODS Jaquel MCP Server
A Model Context Protocol (MCP) server for ASAM ODS with odsbox Jaquel query tools, ODS connection management, and measurement data access.
Overview
🔌 Built-in ODS connection management
🧰 MCP tools: schema inspection, query validation, direct ODS query execution and measurement data analysis
🏗️ Entity hierarchy visualization (AoTest → AoMeasurement)
🚀 Validate, explain and execute JAQueL queries for ASAM ODS
📦 Bulk timeseries/submatrix data access and script generation
📊 Automatic Jupyter notebook generation for measurement comparison
📈 Matplotlib visualization code generation
📉 Statistical measurement comparison and correlation analysis
🔎 Measurement hierarchy exploration and discovery
💡 Interactive starting prompts for guided workflows
🤖 AI-guided bulk API learning with
help_bulk_apitool📝 Comprehensive documentation and test suite
Related MCP server: Filesystem MCP Server
Documentation
Prompts Guide: See
PROMPTS.mdfor starting prompts documentationTool Reference: See
TOOLS_GUIDE.mdChangelog: See
CHANGELOG.md
Quick Start
Installation
Using uvx (Recommended)
The easiest way to use this MCP server is with uvx:
uvx odsbox-jaquel-mcp@latestThis automatically installs and runs the server without managing virtual environments.
Using uv tool (persistent install)
For a persistent installation:
uv tool install odsbox-jaquel-mcp
odsbox-jaquel-mcpUsing project virtual environment
uv venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
uv pip install odsbox-jaquel-mcp[play]Note: The
[play]extra includes optional data analysis and visualization dependencies (pandas, matplotlib, scipy) for working with Jupyter notebooks and data analysis.
Running the Server
The server runs on stdin/stdout and waits for MCP messages from an MCP client:
# With uvx (auto-installs and runs)
uvx odsbox-jaquel-mcp@latest
# With uv tool (if installed)
odsbox-jaquel-mcp
# With project environment
uv run python -m odsbox_jaquel_mcpConfiguration for MCP Clients
Add to your MCP client configuration (e.g., Claude Desktop, VS Code):
{
"mcpServers": {
"ods-mcp": {
"type": "stdio",
"command": "uvx",
"args": ["odsbox-jaquel-mcp@latest"]
}
}
}Or with uv tool:
{
"mcpServers": {
"ods-mcp": {
"type": "stdio",
"command": "odsbox-jaquel-mcp"
}
}
}Environment Variables
Variable | Default | Description |
| not set (disabled) | Set to |
|
| Controls the server-side log level ( |
|
| Authentication mode for |
| not set | ODS server URL for |
| not set | ODS username (basic mode) |
| not set | ODS password (basic mode; falls back to keyring, checking |
| not set | OAuth2 token endpoint (m2m mode) |
| not set | Client ID (m2m mode) |
| not set | Client secret (m2m mode; falls back to keyring, checking |
| not set | Client ID (oidc mode) |
| not set | Redirect URI (oidc mode, e.g. |
|
| TLS certificate verification ( |
See TOOLS_GUIDE.md for the full list of authentication variables and keyring fallback details.
Secrets are looked up in the ods-pilot keyring service first using <service>::<username> records, then in the legacy direct service lookup if no entry is found.
Usage Monitoring
When ODSBOX_STATS_ENABLED=true is set, the server records tool call and resource read statistics to a local SQLite database:
Location:
~/.local/share/odsbox-jaquel-mcp/odsbox-jaquel-mcp-stats.db(Linux/macOS) or%APPDATA%\odsbox-jaquel-mcp\odsbox-jaquel-mcp-stats.db(Windows), with fallback to the system temp directory.Tracked per tool: call count, error count, total execution time (ms), last called timestamp.
Tracked per resource: read count, error count, total execution time (ms), last read timestamp.
Cross-process safe: uses SQLite WAL mode, so multiple concurrent MCP sessions can write safely.
You can query the stats database directly:
sqlite3 ~/.local/share/odsbox-jaquel-mcp/odsbox-jaquel-mcp-stats.db \
"SELECT name, calls, errors, total_ms FROM tool_stats ORDER BY calls DESC"Example MCP client configuration with monitoring enabled:
{
"mcpServers": {
"ods-mcp": {
"type": "stdio",
"command": "uvx",
"args": ["odsbox-jaquel-mcp@latest"],
"env": {
"ODSBOX_STATS_ENABLED": "true",
"FASTMCP_LOG_LEVEL": "WARNING"
}
}
}
}Development
Setup
git clone https://github.com/totonga/odsbox-jaquel-mcp.git
cd odsbox-jaquel-mcp
uv venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
uv sync --all-extras --group devCommon Tasks
# Run server locally
uv run python -m odsbox_jaquel_mcp
# Run tests
uv run pytest tests/
# or
python run_tests.py
# Code formatting and linting
ruff check .
ruff format .
# Build package
uv build
# Test with MCP Inspector
npx @modelcontextprotocol/inspector uvx odsbox-jaquel-mcp@latestContributing
Pull requests and issues are welcome! Please:
Follow PEP8 and use type hints
Add/maintain tests for new features
Update documentation as needed
License
This project is licensed under the Apache License 2.0. See LICENSE.
Links
Features
Core MCP Tools
Connection Management
ods_connect - Establish ODS connection
ods_connect_using_env - Establish ODS connection using environment variables
ods_disconnect - Close ODS connection
ods_get_connection_info - Get connection status
Schema Inspection
schema_get_entity - Get all fields for entity
schema_list_entities - List all entities with relationships
schema_test_to_measurement_hierarchy - Get ASAM ODS test hierarchy structure
Query Building & Validation
query_validate - Check query syntax and structure
query_describe - Get plain English explanation
query_execute - Execute query on ODS server
Timeseries/Submatrix Data Access
data_get_quantities - List measurement quantities for submatrix
data_read_submatrix - Read timeseries data from submatrix
data_generate_fetcher_script - Generate Python scripts for data fetching
Pattern & Example Library
query_generate_skeleton - Generate query skeleton (basic query) for entity
query_get_pattern - Get template for common patterns
query_list_patterns - List available patterns
query_get_operator_docs - Learn about operators
Starting Prompts
Discover and use the server's capabilities through interactive guided prompts:
ODS Server Connection - Set up and manage connections
Validate a Jaquel Query - Learn query validation
Explore Query Patterns - Find common query templates
Bulk Data Access - Master the 3-step Bulk API workflow
Measurement Analysis - Compare measurements and visualize data
See PROMPTS.md for complete details on all starting prompts.
Error Handling
Common Errors and Solutions
Not connected
{
"error": "Model not loaded",
"hint": "Connect to ODS server using 'ods_connect' tool first"
}Solution: Call ods_connect first
Invalid entity
{
"error": "Entity not found: InvalidEntity",
"available_entities": ["AoUnit", "AoMeasurement", ...]
}Solution: Use valid entity from available_entities
Invalid field
{
"valid": false,
"issues": ["Field 'invalid_field' not found"],
"suggestions": ["id", "name", "description"]
}Solution: Use one of the suggested fields
Connection failed
{
"success": false,
"error": "Connection refused",
"error_type": "ConnectionError"
}Solution: Check URL, server availability, firewall
Troubleshooting
Issue: Tools not discovered
Ensure mcp>=0.1.0 is installed
Check ToolsCapability is set in ServerCapabilities
Restart MCP client
Issue: Schema tools fail
Ensure ODS server is accessible
Check username/password
Verify network connectivity
Review server logs
Issue: Queries timeout
Increase request_timeout in connect
Reduce $rowlimit
Check ODS server performance
Performance Tips
Use specific filters - Avoid querying all records
Limit rows - Always use
$rowlimitappropriatelySelect attributes - Only retrieve needed columns/attributes
Index awareness - Filter on indexed fields first
Connection reuse - Keep connection open when possible
Cache schemas - Schema inspection is cached
Security Notes
Credentials are only held in memory during connection
Connection is cleaned up on disconnect
No credentials stored in config files
Use HTTPS with
verify_certificate: truefor production
Install in VSCode
{width=300px}
Try with example server configuration using all three authentication modes via different env prefixes:
{
"servers": {
"ods": {
"type": "stdio",
"command": "uvx",
"args": [
"odsbox-jaquel-mcp@latest"
],
"env": {
"ODSBOX_MCP_URL": "https://docker.peak-solution.de:10032/api",
"ODSBOX_MCP_USER": "Demo",
"ODSBOX_MCP_PASSWORD": "mdm",
"ODSBOX_MCP2_MODE": "m2m",
"ODSBOX_MCP2_URL": "https://ods.example.com/api",
"ODSBOX_MCP2_M2M_TOKEN_ENDPOINT": "https://auth.example.com/realms/myrealm/protocol/openid-connect/token",
"ODSBOX_MCP2_M2M_CLIENT_ID": "my-service-client",
"ODSBOX_MCP3_MODE": "oidc",
"ODSBOX_MCP3_URL": "https://ods.example.com/api",
"ODSBOX_MCP3_OIDC_CLIENT_ID": "my-oidc-client",
"ODSBOX_MCP3_OIDC_REDIRECT_URI": "http://127.0.0.1:1234"
}
}
},
"inputs": []
}Support
For issues or questions:
Check the error message and hints
Review the documentation
Available Tools
22 toolsdata_generate_fetcher_scriptBRead-only
Generate Python scripts for fetching submatrix data with error handling and data processing.
| Name | Required | Description | Default |
|---|---|---|---|
| script_type | Yes | Type of script: basic, advanced, batch, analysis | |
| submatrix_id | Yes | ID of the submatrix to fetch data from | |
| output_format | No | Desired output format for the data | csv |
| include_analysis | No | Include basic data analysis examples | |
| include_visualization | No | Include matplotlib visualization code | |
| measurement_quantity_patterns | No | List of measurement quantity patterns to include |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation readOnlyHint=true already establishes that the operation has no side effects. The description adds that the generated scripts include 'error handling and data processing', but this is vague and does not explain whether the tool returns code, writes files, or executes anything. No contradiction with annotations 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?
The description is one sentence with the core action and object front-loaded: 'Generate Python scripts for fetching submatrix data'. There is no filler or repetition, and the added phrase about error handling and data processing earns its place with relevant context.
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 a full parameter schema, an output schema present, and annotations covering read-only behavior, the description covers the minimum needed to invoke the tool. However, it omits context about how the generated script relates to execution versus other data tools, and it lacks sibling differentiation, leaving some ambiguity for an agent deciding between tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all six parameters. The description does not add meaningful detail about parameters, such as how script_type affects the output or what output_format options imply. It stays at the baseline of 3 given the complete schema coverage.
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 'Generate' with a clear resource 'Python scripts for fetching submatrix data', distinguishing it as a code-generation tool rather than a data-reading tool. It is clear about the deliverable, though it does not explicitly differentiate itself from siblings like data_read_submatrix or plot_generate_code.
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 provides no guidance on when to use this tool versus alternatives such as data_read_submatrix, which actually reads data, or plot_generate_code, which generates visualization code. There are no use conditions, exclusion criteria, or scenario hints.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
data_get_quantitiesBRead-only
Get available measurement quantities for a submatrix.
| Name | Required | Description | Default |
|---|---|---|---|
| submatrix_id | Yes | ID of the submatrix |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds the notion of 'available quantities' but does not disclose additional behavior such as output shape, error conditions, or relationship to other data operations. No contradiction 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?
A single, front-loaded sentence that conveys the operation and target resource with no wasted words. It is appropriately concise for a simple one-parameter 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?
For a simple read-only tool with one parameter, an output schema, and a readOnlyHint annotation, the description is sufficient. It could mention when to use this tool, but the low complexity and existing structured information keep the gap minor.
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?
The schema covers the only parameter fully, including a description for submatrix_id. The tool description adds no extra parameter context, but the baseline of 3 applies when schema 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 action ('Get') and resource ('available measurement quantities for a submatrix'), which distinguishes it from sibling operations like data_read_submatrix. However, it does not explicitly contrast itself with any sibling, so it is clear but not fully differentiating.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance is provided, nor are alternative tools mentioned. The description gives no indication of when to choose this over related data tools such as data_read_submatrix or data_generate_fetcher_script.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
data_read_submatrixARead-only
Read timeseries data from a submatrix using bulk data access.
| Name | Required | Description | Default |
|---|---|---|---|
| submatrix_id | Yes | ID of the submatrix to read | |
| case_insensitive | No | Whether pattern matching should be case insensitive | |
| max_preview_size | No | Maximum number of rows in data preview (default: 100) | |
| date_as_timestamp | No | Convert date columns to pandas timestamps | |
| preview_sampling_method | No | Method for resampling preview data: auto, uniform, time_aware, random, stratified, minmax | auto |
| set_independent_as_index | No | Set the independent column as DataFrame index | |
| measurement_quantity_patterns | No | List of measurement quantity name patterns to include |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description's 'Read' is consistent with the readOnlyHint annotation, and 'bulk data access' adds a small behavioral nuance. The description does not go beyond this to mention rate limits, pagination behavior, or any other operational traits, but the annotation already covers the safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler. It front-loads the action and resource and immediately distinguishes the data access method. Every clause contributes to understanding.
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?
Given the readOnlyHint annotation and the presence of a full output schema plus 100% parameter schema coverage, the description does not need to re-explain returns or parameters. The definition is functionally complete for a read operation, though a brief note about when 'bulk data access' applies could have added a bit more context.
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 seven parameters with meaningful descriptions. The tool description adds no parameter-specific guidance beyond the general notion of reading a submatrix, so it does not 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?
The description states a specific verb and resource ('Read timeseries data from a submatrix') and adds 'using bulk data access' to characterize the access mode. It is clear, but it does not explicitly distinguish this tool from siblings such as data_get_quantities or query_execute.
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 phrasing implies the tool should be used when reading timeseries data from a submatrix via bulk access, so the usage context is lightly implied. However, there is no explicit guidance about when to use this tool instead of sibling tools or any exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
help_bulk_apiARead-only
Get help and guidance on using the Bulk API for loading timeseries data.
Use this to understand the 3-step workflow and common patterns.
| Name | Required | Description | Default |
|---|---|---|---|
| tool | No | Optional: Get contextual help for a specific tool (e.g., data_read_submatrix, ods_connect) | |
| topic | Yes | Help topic |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds that the tool provides guidance on workflows and patterns, but does not go into deeper behavioral details such as response format or how topics are presented; however, the output schema and topic enum reduce the need for that.
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 concise sentences with no filler. The main purpose is front-loaded, and the second sentence adds actionable usage guidance without 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?
For a help/documentation tool, the description plus the rich input schema and output schema give the agent everything needed to call it correctly: required topic, available enum values, optional tool parameter, and read-only annotations. No critical context 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 the topic and optional tool parameters are already well documented. The description adds general context about the 3-step workflow and patterns, which maps conceptually to some enum values, but it does not add detailed semantics 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?
The description uses a specific verb ('Get help and guidance') with a clear resource ('Bulk API for loading timeseries data') and elaborates on the key workflow ('3-step workflow and common patterns'). This makes it readily distinguishable from the sibling query and data tools, which target different operations.
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 says 'Use this to understand the 3-step workflow and common patterns,' giving clear context for when the tool is appropriate. It does not name alternative tools or exclusions, but the guidance is sufficient for an agent to recognize this is the help entry point for Bulk API usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ods_connectB
Establish connection to ASAM ODS server for live model inspection.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ODS API URL (e.g., http://localhost:8087/api) | |
| verify | No | Verify SSL certificates (default: true) | |
| password | Yes | ||
| username | Yes | ODS username for authentication |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| connection | Yes | Connection information for an active ODS server connection. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations say readOnlyHint=false, destructiveHint=false, so the tool is already marked as non-read-only and non-destructive. The description adds that it establishes a connection, which implies a stateful side effect. It does not mention connection lifecycle, cleanup via 'ods_disconnect', or any additional behavioral consequences, but it does not contradict 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?
A single, front-loaded sentence with no filler. It states the action first and the purpose second. Every word contributes something meaningful.
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 basic connection tool, the schema and annotations cover a good deal of what is needed to invoke it. The missing pieces are guidance on when to prefer this over 'ods_connect_using_env' and the expected lifecycle after connecting. The output schema exists, so return-value documentation is not needed here.
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?
The description contains no parameter-level information. The schema documents 3 of 4 properties (url, username, verify), with password left undescribed, so schema coverage is 75%—not high enough to fully absolve the description from adding context. The description adds nothing about how the parameters are used or what happens with the credentials.
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 ('Establish connection') with a concrete resource ('ASAM ODS server') and states the intended use ('live model inspection'). This makes the tool's basic purpose clear. However, it does not differentiate this from the sibling 'ods_connect_using_env', which seems to perform a very similar task via environment credentials.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for live model inspection' provides an implied use case: connect when live inspection is needed. Yet there is no explicit guidance about when to choose this tool over 'ods_connect_using_env' or how it relates to 'ods_disconnect'. The selection is left largely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ods_connect_env_listARead-only
List all ODS servers configured via environment variables.
Returns each server's prefix and URL so you can identify the right server
and connect with ods_connect_using_env(env_prefix='PREFIX').
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only (readOnlyHint: true), and the description adds useful context by specifying the returned data (server prefix and URL). It does not contradict annotations and gives enough behavioral detail for a simple list operation.
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 compact and front-loaded with the core purpose in the first sentence. The second sentence adds valuable connection guidance without redundancy or filler.
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-parameter, read-only list tool with an output schema and annotations, the description is complete. It explains what the tool returns and how to use the result, which is all an agent needs to select and call it 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?
This tool takes zero parameters, so there are no parameter semantics to document. The description correctly focuses on output and usage, meeting the baseline for a parameterless tool.
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 ('List') and a specific resource ('ODS servers configured via environment variables'), and states the output (prefix and URL). It clearly differentiates this tool from siblings like ods_connect_using_env by framing this as the lookup step before connecting.
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 when to use the tool: to identify the right server before connecting. It explicitly directs the agent to ods_connect_using_env(env_prefix='PREFIX') afterward, which is actionable guidance that ties the tool to its intended workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ods_connect_using_envA
Establish connection to ASAM ODS server using environment variables.
Default prefix is ODSBOX_MCP; set ODSBOX_MCP_ENV_PREFIX or pass env_prefix. Falls back to legacy ODS_ prefix variables.
Supports three authentication modes via {prefix}MODE or ODSBOX_MCP{prefix}_MODE:
basic (default): Username/password. Vars: URL, USERNAME, PASSWORD, VERIFY.
m2m: OAuth2 client credentials. Vars: URL, M2M_TOKEN_ENDPOINT, M2M_CLIENT_ID, M2M_CLIENT_SECRET, M2M_SCOPE (optional, comma-separated), VERIFY.
oidc: OpenID Connect browser login. Vars: URL, OIDC_CLIENT_ID, OIDC_REDIRECT_URI, OIDC_CLIENT_SECRET (optional), OIDC_WEBFINGER_PATH_PREFIX, OIDC_AUTHORIZATION_ENDPOINT, OIDC_TOKEN_ENDPOINT, OIDC_LOGIN_TIMEOUT, OIDC_REDIRECT_INSECURE, OIDC_SCOPE, VERIFY.
Secrets (passwords, client_secrets) fall back to keyring when not in env.
| Name | Required | Description | Default |
|---|---|---|---|
| env_prefix | No | Optional: override the environment variable prefix (default: ODSBOX_MCP) |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| connection | Yes | Connection information for an active ODS server connection. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry the read/write/destructivity profile (readOnly=false, destructive=false, openWorld=true). The description adds meaningful behavior: lists three auth modes (basic, m2m, oidc), enumerates required variables, and documents the legacy pref ix fallback. No contradiction with 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 is long but structured with intro, a listed env-var templates, and organized auth modes. However, the sentence about 'Supports three authentication modes via {prefix }_ODE or ODSBOXX_MCP_{prefix}_ODE' appears confusingly worded; the ODSBOXX_MCP_{prefix}_ODE form is redundant or erroneous, which wastes space and could mislead an agent.
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?
Given the tool's auth complexity, the description covers defaults, env vars, mode selection, legacy fallback, and the relationship to ods_connect. Combined with the output schema and annotations, an agent has enough to invoke it. Minor gaps such as side effects or whether the connection must later be closed are left unspecified, but the sibling ods_disconnect and openWorld hint mitigate that.
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. The description adds extra meaning for env_prefix by explaining the default prefix (ODS box_MCP), the env var that can change it (ODS box_MCP_ENV_PREFIX), and how env_prefix interplays with the mode templates beyond the schema's bare 'override the environment variable pref ix'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb, resource, and mechanism: 'Establish connection to ASAMOD server using environment variables.' It also tells the reader this is the env-var alternative to ods_connect, which distinguishes it from siblings 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?
Explicitly says when to use it: 'This is an alternative to ods_connect for when you have an existing environment of ODS boxes variables.' It describes a default and fallback for auth modes, giving clear conditions for choosing this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ods_disconnectAIdempotent
Close connection to ODS server.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true and destructiveHint=false, covering repeated-call and non-destructive behavior. The description adds only the target ('ODS server') and does not disclose extra behavioral nuances such as whether an active connection is required or how pending queries are affected, but for a zero-parameter disconnect this is acceptable.
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 five words in one clear sentence with no filler. It places the action and object up front and earns its place entirely.
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-parameter, annotation-covered lifecycle tool with an output schema, the description is essentially complete. The sibling list already provides the connection context, though the description could explicitly mention that this is the cleanup counterpart to ods_connect.
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?
The input schema has no parameters and schema description coverage is 100%, so there is nothing for the description to add. The baseline for zero-parameter tools 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?
The description states the exact action ('Close') and resource ('connection to ODS server'), making the tool's function immediately unambiguous. It is also clearly distinguished from siblings like ods_connect, ods_connect_using_env, and ods_get_connection_info.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use guidance or alternatives are mentioned, but as a connection-lifecycle tool it is clearly meant to pair with the connect tools. The description leaves the intended timing ('after connection work is done') to inference rather than stating it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ods_get_connection_infoARead-only
Get current ODS connection information.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is consistent with the readOnlyHint annotation and adds the 'current connection' framing, which implies it reports state rather than modifying it. However, it does not disclose any additional behavioral traits such as behavior when no connection exists or whether the result reflects locally cached vs. live connection data. The annotation already covers the core safety profile, so this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler or repetition. For a zero-parameter getter tool, this is appropriately concise and structurally efficient.
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?
Given the tool has no parameters, has a readOnlyHint annotation, and has an output schema, the description covers the essential purpose without needing to explain return values. It is complete enough for an agent to select and invoke the tool correctly, though a small note about requiring an active ODS connection could add context.
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?
The tool has zero parameters, so there is no parameter semantics burden for the description to carry. The schema is already fully complete and the description does not need to explain any inputs.
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 ('Get') and resource ('current ODS connection information'), making it clear this is a read-only informational tool. It is distinguishable from siblings like ods_connect and ods_disconnect because it retrieves state rather than changing it, though it does not explicitly name those alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to call this tool instead of ods_connect_env_list or ods_connect. The intended use is only implied by the phrase 'current ODS connection information'; there are no explicit conditions, prerequisites, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plot_comparison_notebookA
Generate a Jupyter notebook for comparing measurements.
Uses the active ODS connection (established via ods_connect or ods_connect_using_env). The generated notebook reads the password from the ODS_PASSWORD environment variable at runtime so no credentials are embedded in the notebook file.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Notebook title | Measurement Comparison |
| plot_type | No | Type of plot ("scatter", "line", or "subplots") | scatter |
| output_path | No | Optional path to save notebook (.ipynb file) | |
| available_quantities | No | List of all available quantities (for documentation) | |
| measurement_quantity_names | Yes | Names of quantities to plot | |
| measurement_query_conditions | Yes | Filter conditions for measurements (MeaResult attributes). Example: {"Name": {"$like": "Profile_*"}} or {"TestStep.Test.Name": {"$eq": "MyTest"}} |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses an important behavioral detail: the generated notebook reads the password from ODS_PASSWORD at runtime, avoiding embedded credentials. This goes beyond the annotations and adds useful security-relevant context. No contradiction with readOnlyHint=false or destructiveHint=false.
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 three short sentences with no redundant content. The main purpose is front-loaded, and the connection and credential-handling details each earn their 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?
The description covers the key prerequisite connection requirement and the security-relevant caching behavior. Combined with the rich input schema, enum options, and output schema, an agent has enough context to invoke the tool, though explicit sibling differentiation is left unstated.
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 parameters including examples for measurement_query_conditions. The description does not add additional parameter-level meaning, making the baseline 3 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 clearly states the verb-action 'Generate a Jupyter notebook' and the resource purpose 'comparing measurements'. It differentiates itself from the sibling plot_generate_code by specifying the notebook format rather than generic code generation.
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 mentions a prerequisite (active ODS connection via ods_connect or ods_connect_using_env) but gives no guidance on when to choose this tool over alternatives such as plot_generate_code. There are no exclusions or explicit 'when to use' instructions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plot_generate_codeARead-only
Generate Python plotting code for measurement comparison.
| Name | Required | Description | Default |
|---|---|---|---|
| plot_type | Yes | Type of plot ("scatter", "line", or "subplots") | |
| submatrices_count | Yes | Number of submatrices to plot | |
| measurement_quantity_names | Yes | List of quantity names to plot |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish readOnlyHint=true, and the description aligns by saying it generates code rather than mutating data. It adds useful context that the output is Python plotting code, but it does not describe the output format, whether the code is standalone, or any limitations beyond what the annotations and output schema already imply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler, repetition, or redundant content. It communicates the action, resource, and purpose efficiently, which is ideal for an agent scanning tool descriptions.
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?
The tool is low complexity: all three required parameters are fully described in the schema and an output schema is present, so the description does not need to restate parameters or return values. The remaining gap is the lack of explicit differentiation from plot_comparison_notebook, which prevents a perfect score.
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 three parameters are already documented with types and descriptions in the input schema. The description adds only the high-level 'measurement comparison' framing and no additional detail about how the parameters relate to one another, so the baseline score 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?
The description clearly identifies the action ('Generate') and the resource ('Python plotting code') and adds the purpose 'for measurement comparison.' It does not explicitly name sibling tools, but the focus on Python plotting code distinguishes it from notebook-oriented or data-fetching siblings such as plot_comparison_notebook and data_generate_fetcher_script.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for measurement comparison' implies when the tool is appropriate, but there is no explicit guidance about when to use it versus plot_comparison_notebook or other plotting/code-generation siblings, and no exclusions are stated. This is adequate but leaves the choice to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_describeBRead-only
Describe what a Jaquel query does.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Jaquel query dict to describe. Top-level key is entity name, value is filter/attribute object. Example: {"AoTest": {"name": {"$like": "*"}}, "$attributes": {"id": 1, "name": 1}} |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations declare readOnlyHint=true, and the description is consistent with that, indicating a non-mutating operation. It adds the behavioral idea that the tool produces a description rather than executing the query, but it does not disclose output format or whether a connection is required. The output schema likely covers return details, so this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence with no filler or redundancy. It is front-loaded and easy to parse. It earns its place, though it is slightly underspecified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-only tool with an output schema, the core purpose is conveyed. However, the description lacks any mention of when to prefer this tool over related query tools or what kind of description the agent should expect. It is minimally complete but leaves selection and expectation-setting to inference.
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%: the query parameter has a type, description, and an example. The tool description itself adds no additional parameter-level meaning, 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?
The description uses a clear verb+resource pair: 'Describe what a Jaquel query does.' It is unambiguous about the tool's action, and the resource (Jaquel query) matches the input schema. It does not explicitly contrast with sibling tools like query_validate or query_get_pattern, 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 guidance on when to use this tool versus alternatives such as query_validate, query_get_pattern, or query_execute. The description merely states what the tool does, leaving the agent to infer selection criteria from the name and siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_executeBRead-only
Execute a Jaquel query directly on connected ODS server.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Jaquel query dict to execute. Top-level key is entity name, value is filter/attribute object. Example: {"AoTest": {"name": {"$like": "*"}}, "$attributes": {"id": 1, "name": 1}, "$options": {"$rowlimit": 100}} | |
| max_rows | No | Maximum number of rows to return (default: 100). Also capped adaptively by max_cells to protect LLM context size. Use a small value like 10-20 for wide results (many columns). | |
| max_cells | No | Adaptive cell budget: effective_rows = min(max_rows, max_cells // col_count). Default 10 000 ≈ 6 000 LLM tokens for double data. Increase only if you need more data and understand the context cost. | |
| result_format | No | Result serialisation format: "split" (default) encodes column names once — {"columns": [...], "index": [...], "data": [...]}; "records" repeats all keys per row — [{"col": val, ...}, ...]. "split" is more token-efficient for wide results. | split |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already conveys the safety profile, and the description is consistent with it, so there is no contradiction. The word 'directly' suggests immediate execution without validation or transformation, and the requirement of a connected ODS server is hinted, but the description does not disclose failure modes, validation behavior, or context-size safeguards beyond what the schema explains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler or redundant wording. Every word contributes to identifying the operation, making it highly concise while remaining more informative than a tautology.
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?
The input schema is unusually rich, the read-only annotation is present, and an output schema exists, so the description does not need to explain return values or parameter details. The main gap is the lack of routing guidance relative to query_validate and other siblings, but for an execution tool with this much structured context, the definition is close to complete.
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 schema already provides detailed semantics: a full Jaquel query example, defaults for max_rows, the adaptive max_cells formula, and format/token guidance for result_format. The description itself adds no parameter-level meaning, so the baseline score 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?
The description states a specific action ('Execute'), a specific resource ('a Jaquel query'), and a target ('connected ODS server'), which makes the tool's core purpose clear. It does not explicitly contrast it with sibling tools like query_validate, query_describe, or data_read_submatrix, but the verb 'execute' plus 'directly' gives the agent a reasonable basis for differentiation.
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 guidance on when to use this tool versus query_validate, query_generate_skeleton, query_describe, or data_read_submatrix. It does not mention whether the query should be validated first, whether an active ODS connection is required beyond the phrase 'connected', or when an alternative would be preferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_generate_skeletonBRead-only
Generate a query skeleton for a specific entity and operation.
| Name | Required | Description | Default |
|---|---|---|---|
| operation | No | Type of query: get_all, get_by_id, get_by_name, search_and_select | get_all |
| entity_name | Yes | ODS entity name (e.g. 'AoTest', 'AoMeasurement', 'AoSubMatrix') |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds that the tool generates a skeleton rather than executing a query, but it does not explain what the skeleton contains or how it should be used afterward.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler, the verb is front-loaded, and every word contributes to identifying the core action and scope.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with an output schema and read-only annotations, the basic invocation is reasonably covered. However, in a family of many query_* siblings, the lack of any positioning information leaves uncertainty about preconditions and relationship to other tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both parameters already have meaningful descriptions and examples. The description only adds the generic phrase 'specific entity and operation', which does not meaningfully extend the parameter information already available.
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 the specific verb 'Generate', the object 'query skeleton', and the scope 'specific entity and operation'. This is clear and distinguishes it from execution or validation tools, though it does not explicitly name sibling tools for 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?
No guidance is provided about when to use this tool versus closely related siblings such as query_get_pattern, query_describe, query_validate, or query_execute. An agent is left to infer the tool's role from its name and the word 'skeleton'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_get_operator_docsARead-only
Get documentation and examples for a Jaquel operator.
| Name | Required | Description | Default |
|---|---|---|---|
| operator | Yes | Jaquel operator name, e.g. '$like', '$gt', '$in', '$between' |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes that this is a safe read operation. The description adds no additional behavioral context such as return type details, error behavior, or authentication requirements, but it also does not contradict 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 is a single, front-loaded sentence with no filler. Every word contributes to explaining what the tool does, which is ideal for a simple one-parameter documentation 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?
For a single-parameter, read-only tool with an output schema, the description is fully sufficient. It tells the agent what the tool returns, and the input is fully defined in the schema.
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 schema already documents the 'operator' parameter with examples. The description adds no new parameter semantics, but none are needed given the schema's completeness.
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 action ('Get documentation and examples') and a specific resource ('Jaquel operator'), so an agent knows exactly what the tool provides. The resource term also distinguishes it from siblings like query_get_pattern and query_describe.
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 this tool is for retrieving Jaquel operator documentation, but it does not explicitly state when to prefer it over sibling tools or mention any exclusions. Usage context is inferable rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_get_patternBRead-only
Get a template for a common Jaquel query pattern.
| Name | Required | Description | Default |
|---|---|---|---|
| pattern | Yes | Pattern name: get_all_instances, get_by_id, get_by_name, case_insensitive_search, time_range, inner_join, outer_join, aggregates |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description is not required to restate safety behavior. It does add that the tool provides a template for a common pattern, but it does not disclose additional behavioral traits such as what the template contains, whether unknown pattern names fail, or how the template is returned. No contradiction with 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?
A single sentence states the tool's purpose with no filler. It is front-loaded and appropriately sized for a one-parameter, low-complexity 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?
With a single required parameter, a complete enum in the schema, an output schema, and read-only annotations, the description is largely sufficient. The main gap is the lack of usage guidance relative to sibling tools, but that is already penalized under usage_guidelines.
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%: the single pattern parameter lists all accepted values in its description. The tool description adds little beyond the schema, 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?
The description states a clear verb and resource: getting a template for a Jaquel query pattern. It is distinct enough from siblings like query_list_patterns (which lists patterns) and query_generate_skeleton (which may generate code), though it doesn't explicitly draw those contrasts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus related tools such as query_validate, query_get_operator_docs, or query_generate_skeleton. The intended use is only implied by the name and the pattern parameter, not explicitly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_list_patternsARead-only
List all available Jaquel query patterns and templates.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only, and the description adds little behavioral context beyond enumerating available items. There is no mention of output granularity, ordering, or whether the list is static, though the output schema likely covers the return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence conveys the entire operation with no filler or redundancy. It is appropriately minimal for a parameterless listing 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?
For a zero-parameter, read-only listing tool with an output schema, this description is sufficient: an agent knows exactly what operation is offered and that it is safe to call. No missing information would prevent correct selection or 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?
The input schema has zero parameters and 100% schema coverage, so there is nothing for the description to explain. The baseline of 4 for parameterless tools applies; the description correctly focuses on the operation rather than parameter details.
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 ('List') and a precise resource ('all available Jaquel query patterns and templates'), making the operation unmistakable. It naturally distinguishes this list-all tool from the sibling query_get_pattern, which retrieves a single pattern.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'List all available' implies the tool should be used when an agent needs to enumerate the full set of patterns/templates, but the description never explicitly states when to use it versus query_get_pattern or query_get_operator_docs. No alternative tools or exclusions are named, so guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_validateARead-only
Validate a Jaquel query structure for syntax errors and best practices.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Jaquel query dict to validate. Top-level key is the entity name (e.g. 'AoTest'), value is a filter/attribute object. Example: {"AoTest": {"name": {"$like": "*"}}, "$attributes": {"id": 1, "name": 1}, "$options": {"$rowlimit": 100}} |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, so no safety contradiction exists. The description adds that validation covers syntax errors and best practices, giving useful behavioral scope beyond the annotations. It does not detail the exact validation rules, but the output schema can cover the return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. Every word contributes meaning, and the core action is stated immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-only validator with an output schema, the description is nearly sufficient. It could explicitly clarify that validation does not execute the query or contrast itself with query_execute, but the schema and annotations cover the remaining essential context.
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 single 'query' parameter is thoroughly documented with a concrete Jaquel query example. The tool description adds no parameter-level meaning, so the baseline score 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 ('Validate'), a specific resource ('Jaquel query structure'), and the exact concerns checked ('syntax errors and best practices'). This clearly distinguishes it from sibling tools like query_execute, query_describe, and query_generate_skeleton.
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 tool is used to check a query before executing it, but it never explicitly says when to use it vs. alternatives or names query_execute as the complementary follow-up. The usage context is inferable but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schema_field_existsBRead-only
Check if a field exists in entity schema.
| Name | Required | Description | Default |
|---|---|---|---|
| field_name | Yes | Field/attribute name to check (e.g. 'name', 'id', 'version') | |
| entity_name | Yes | ODS entity name (e.g. 'AoTest', 'AoMeasurement') |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the read-only safety profile is provided. The description aligns with this annotation but adds no additional behavioral context (e.g., whether 'exists' means closed-world, error behavior, or usage limits). With annotations covering the main safety profile, 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?
The description is a single sentence with no wasted words, front-loading the core action. It is appropriately sized for a simple 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?
The tool is simple, both parameters are fully documented, an output schema exists, and annotations cover the read-only nature. The description lacks usage guidelines but is otherwise sufficient for an agent to invoke the tool correctly. Minor gap in not stating when to use it.
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?
The input schema documents both parameters with 100% coverage and includes concrete examples. The description adds no extra parameter semantics beyond what the schema already 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?
The description states a specific action ('check if a field exists') and a clear resource ('entity schema'), making the tool's purpose unambiguous. No sibling tools are listed, so differentiation is not required. A small deduction for not specifying what the check returns, though the output schema presumably covers that.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives, nor any exclusions or prerequisites. The description only states what the tool does, not when it should be selected, leaving the agent to infer appropriateness from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schema_get_entityARead-only
Get available fields for an entity from ODS model.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_name | Yes | Entity name (e.g., 'StructureLevel') |
Output Schema
| Name | Required | Description |
|---|---|---|
| entity | Yes | |
| attributes | Yes | |
| description | Yes | |
| derived_from | Yes | |
| relationships | Yes | |
| example_queries | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safe read-only behavior is covered. The description adds the ODS model source context but does not disclose additional behavioral details such as error conditions or whether a connection must already exist. No contradiction with 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 is a single front-loaded sentence with no wasted words. It immediately communicates the action and resource without unnecessary background.
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 one required parameter fully documented in the schema, a read-only annotation, and an output schema present, the description is sufficient for an agent to invoke the tool correctly. No critical information 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?
The input schema provides 100% coverage for entity_name, including an explicit example, so the schema carries the parameter documentation burden. The description adds no extra meaning about the parameter beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Get available fields') and a clear resource ('an entity from ODS model'). It is plainly distinct from siblings like schema_list_entities and schema_field_exists by focusing on retrieving all fields for one entity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as schema_field_exists or schema_list_entities. The intended usage must be inferred entirely from the tool name and description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schema_list_entitiesARead-only
Return a list of existing entities from the ODS server ModelCache.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds the source context 'ODS server ModelCache' and the 'existing entities' scope, but does not disclose details such as ordering, whether entity metadata is included, or whether a connection is required first.
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 entire description is one concise sentence that front-loads the action and resource. There is no wasted wording or repetition of structured fields.
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-parameter tool with an output schema available, the description is suitably complete. It names the resource, states the operation, and gives the source location. No additional explanation of return values is needed because the output schema covers that.
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?
The input schema has zero parameters and schema description coverage is 100%, so there are no parameter semantics to document. The description still reinforces that no inputs are needed and that it simply returns the existing entity list.
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 clearly states the action ('Return a list'), the resource ('existing entities'), and the source ('ODS server ModelCache'). This distinguishes it from sibling tools like schema_get_entity, which targets a single entity, and query_* tools, which handle queries.
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 provides no explicit guidance on when to use this tool versus alternatives such as schema_get_entity or schema_field_exists. The context 'existing entities' implies a listing use case, but there is no direct statement of applicability, exclusions, or prerequisite connection steps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schema_test_to_measurement_hierarchyARead-only
Get hierarchical entity chain from AoTest to AoMeasurement via 'children' relation.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description does not contradict that. It adds useful traversal semantics (AoTest -> AoMeasurement via 'children'), but it does not disclose additional behavior such as recursion depth, ordering, empty-result behavior, or whether intermediate nodes are included.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence conveys the operation without filler. Every word contributes to identifying the resource, endpoints, and relation.
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?
Given zero parameters, an output schema, and a read-only annotation, the description is nearly complete for invocation. It fully specifies the traversal path, though it could strengthen completeness by adding when to use it relative to sibling schema tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so parameter semantics are not applicable and the baseline of 4 applies. The description has no parameter information to add because none exist.
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 ('Get') and resource ('hierarchical entity chain'), and identifies exact start and end entities ('AoTest' to 'AoMeasurement') plus the relation ('children'). This clearly differentiates it from more generic sibling tools like schema_get_entity and schema_list_entities.
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 use case is implied: call this when you need the AoTest-to-AoMeasurement hierarchy via the children relation. However, it does not explicitly state when to prefer this over alternatives, nor does it mention any exclusions or when-not-to-use conditions.
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.
22 tool updates
v0.1.0- First observed
data_generate_fetcher_script - First observed
data_get_quantities - First observed
data_read_submatrix - First observed
help_bulk_api - First observed
ods_connect - First observed
ods_connect_env_list - First observed
ods_connect_using_env - First observed
ods_disconnect - First observed
ods_get_connection_info - First observed
plot_comparison_notebook - First observed
plot_generate_code - First observed
query_describe - First observed
query_execute - First observed
query_generate_skeleton - First observed
query_get_operator_docs - First observed
query_get_pattern - First observed
query_list_patterns - First observed
query_validate - First observed
schema_field_exists - First observed
schema_get_entity - First observed
schema_list_entities - First observed
schema_test_to_measurement_hierarchy
TDQS
Scored across 22 tools
Tools are largely distinct with clear domain prefixes (ods_, schema_, query_, data_, plot_), but there is minor overlap between plotting tools (plot_comparison_notebook vs plot_generate_code) and query pattern functions (query_get_pattern vs query_list_patterns), which could cause slight confusion.
All tools follow a consistent snake_case naming convention with domain-based prefixes (e.g., ods_connect, schema_list_entities, query_validate, data_read_submatrix). This makes the set predictable and easy to navigate.
At 22 tools, the set is above the typical 3-15 range but remains reasonable given the broad scope covering connection management, schema inspection, query building, data retrieval, and plotting. Each tool serves a distinct purpose, so it does not feel bloated.
The tool set comprehensively covers the advertised workflow: connection setup and teardown, schema exploration, query validation and generation, data access, and plotting. No obvious gaps exist for the stated purpose of working with ODS/ASAM data.
Maintenance
Related MCP Connectors
MCP server for querying and analyzing data from ad platforms, analytics tools, and spreadsheets
An MCP server giving access to Grafana dashboards, data and more.
A Model Context Protocol (MCP) server for Selise Blocks Cloud integration
MCP server for the Seline Analytics API
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol server that enables SQL query execution, database management, and business intelligence capabilities through MySQL connections.633 npmMIT
- AlicenseNot gradedqualityFmaintenanceA Model Context Protocol server that provides file system operations, analysis, and manipulation capabilities through a standardized tool interface.6MIT
- AlicenseBqualityDmaintenanceA Model Context Protocol server that enables executing SQL queries and managing connections with Microsoft SQL Server databases.12,887 npm6MIT
- FlicenseCqualityDmaintenanceA Model Context Protocol server that provides a standardized interface for interacting with SQL databases through the MCP protocol.36 npm4-