Skip to content

OLS-2568: Mcp app tool registry#2747

Draft
onmete wants to merge 4 commits intoopenshift:mainfrom
onmete:mcp-app-tool-registry
Draft

OLS-2568: Mcp app tool registry#2747
onmete wants to merge 4 commits intoopenshift:mainfrom
onmete:mcp-app-tool-registry

Conversation

@onmete
Copy link
Contributor

@onmete onmete commented Feb 12, 2026

Description

  • Capture structured_content from MCP tool artifacts by calling coroutines directly
  • Add tool UI metadata registry that discovers _meta.ui metadata from MCP servers at startup
  • Filter app-only tools from LLM binding; use placeholder messages for UI tools to save tokens
  • Forward structured_content and UI resource URIs in streamed tool results

Type of change

  • Refactor
  • New feature
  • Bug fix
  • CVE fix
  • Optimization
  • Documentation Update
  • Configuration Update
  • Bump-up dependent library
  • Bump-up library or tool used for development (does not change the final image)
  • CI configuration change
  • Konflux configuration change

Related Tickets & Documents

  • Related Issue #
  • Closes #

Checklist before requesting a review

  • I have performed a self-review of my code.
  • PR has passed all pre-merge test jobs.
  • If it is a core feature, I have added thorough tests.

Testing

  • Please provide detailed steps to perform tests related to this code change.
  • How were the fix/results from this change verified? Please provide relevant screenshots or results.

onmete and others added 4 commits February 12, 2026 10:56
Call the tool coroutine directly instead of ainvoke() to preserve
the (content, artifact) tuple that langchain-mcp-adapters returns.
Extract structured_content from the artifact dict and propagate it
through execute_tool_call (now a 4-tuple) and _execute_single_tool_call
via ToolMessage additional_kwargs.

Co-authored-by: Cursor <cursoragent@cursor.com>
Introduce ols.src.mcp.tool_registry that discovers and caches UI
metadata (_meta.ui.resourceUri, _meta.ui.visibility) from configured
MCP servers. The registry maps tool names to ToolUIMetadata and
resource URIs to config server names, enabling:

- is_model_visible(): filter app-only tools from LLM binding
- get_tool_ui_metadata(): look up UI resource URIs for tool results
- get_config_name_for_resource_uri(): route ui:// URIs to servers

Co-authored-by: Cursor <cursoragent@cursor.com>
Add a FastAPI lifespan handler that calls discover_tool_ui_metadata()
during application startup. This populates the tool registry with UI
metadata from all configured MCP servers so that tool results can be
routed to interactive UIs later.

Co-authored-by: Cursor <cursoragent@cursor.com>
Use is_model_visible() to exclude app-only tools (visibility: ["app"])
from LLM tool binding. For tools with a UI resource, send a short
placeholder message to the LLM instead of the full tool output to
conserve tokens -- the console renders the full data via the
interactive UI.

Also forward structured_content from tool artifacts in streamed
tool_result chunks, handle missing 'properties' key in tool schemas
safely, and include tool_name + server_name in result metadata.

Co-authored-by: Cursor <cursoragent@cursor.com>
@openshift-ci-robot openshift-ci-robot added the jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. label Feb 12, 2026
@openshift-ci-robot
Copy link

openshift-ci-robot commented Feb 12, 2026

@onmete: This pull request references OLS-2568 which is a valid jira issue.

Details

In response to this:

Description

  • Capture structured_content from MCP tool artifacts by calling coroutines directly
  • Add tool UI metadata registry that discovers _meta.ui metadata from MCP servers at startup
  • Filter app-only tools from LLM binding; use placeholder messages for UI tools to save tokens
  • Forward structured_content and UI resource URIs in streamed tool results

Type of change

  • Refactor
  • New feature
  • Bug fix
  • CVE fix
  • Optimization
  • Documentation Update
  • Configuration Update
  • Bump-up dependent library
  • Bump-up library or tool used for development (does not change the final image)
  • CI configuration change
  • Konflux configuration change

Related Tickets & Documents

  • Related Issue #
  • Closes #

Checklist before requesting a review

  • I have performed a self-review of my code.
  • PR has passed all pre-merge test jobs.
  • If it is a core feature, I have added thorough tests.

Testing

  • Please provide detailed steps to perform tests related to this code change.
  • How were the fix/results from this change verified? Please provide relevant screenshots or results.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@onmete onmete marked this pull request as draft February 12, 2026 10:00
@openshift-ci openshift-ci bot added the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label Feb 12, 2026
@openshift-ci
Copy link

openshift-ci bot commented Feb 12, 2026

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by:
Once this PR has been reviewed and has the lgtm label, please assign blublinsky for approval. For more information see the Code Review Process.

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@onmete onmete mentioned this pull request Feb 12, 2026
14 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. jira/valid-reference Indicates that this PR references a valid Jira ticket of any type.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants