Skip to content

Expose MCP servers as explicit toolsets#1876

Closed
kshitijk4poor wants to merge 2 commits into
NousResearch:mainfrom
kshitijk4poor:fix/mcp-platform-toolset-injection
Closed

Expose MCP servers as explicit toolsets#1876
kshitijk4poor wants to merge 2 commits into
NousResearch:mainfrom
kshitijk4poor:fix/mcp-platform-toolset-injection

Conversation

@kshitijk4poor

Copy link
Copy Markdown
Collaborator

Summary

  • materialize each configured MCP server as a real toolset keyed by its server name
  • keep injecting discovered MCP tools into the default hermes-* toolsets for existing behavior
  • make discover_mcp_tools() resync toolsets on idempotent reloads and avoid overwriting built-in toolset names

Motivation

Gateway sessions that use platform_toolsets.<platform> with an explicit raw toolset list bypass hermes-telegram/hermes-* umbrella toolsets. MCP tools were only injected into those umbrella toolsets, so raw entries like github never resolved to any enabled tools for messaging sessions.

This makes the raw MCP server name itself resolvable as a toolset, which fixes the Telegram/messaging override path without changing the default behavior.

Testing

  • python -m pytest -o addopts='' tests/tools/test_mcp_tool.py tests/hermes_cli/test_tools_config.py -q

…nfig(), hoist set constant

run_agent.py:
- Add base_url property that auto-caches _base_url_lower on every
  assignment, eliminating 12+ redundant .lower() calls per API cycle
  across __init__, _build_api_kwargs, _supports_reasoning_extra_body,
  and the main conversation loop
- Consolidate three separate load_config() disk reads in __init__
  (memory, skills, compression) into a single call, reusing the
  result dict for all three config sections

model_tools.py:
- Hoist _READ_SEARCH_TOOLS set to module level (was rebuilt inside
  handle_function_call on every tool invocation)
teknium1 pushed a commit that referenced this pull request Mar 18, 2026
Each configured MCP server now registers as its own toolset in TOOLSETS
(e.g. TOOLSETS['github'] = {tools: ['mcp_github_list_files', ...]}),
making raw server names resolvable in platform_toolsets overrides.

Previously MCP tools were only injected into hermes-* umbrella toolsets,
so gateway sessions using raw toolset names like ['terminal', 'github']
in platform_toolsets couldn't resolve MCP tools.

Skips server names that collide with built-in toolsets. Also handles
idempotent reloads (syncs toolsets even when no new servers connect).

Inspired by PR #1876 by @kshitijk4poor.
Adds 2 tests (standalone toolset creation + built-in collision guard).
@teknium1

Copy link
Copy Markdown
Contributor

The MCP standalone-toolset feature was salvaged in PR #1907 — each server name now registers as its own toolset so raw names work in platform_toolsets overrides. Unrelated refactoring (base_url caching, config consolidation) was dropped as low-value. Thanks @kshitijk4poor for the design!

@teknium1 teknium1 closed this Mar 18, 2026
angelburgosrosado pushed a commit to angelburgosrosado/hermes-agent that referenced this pull request Apr 27, 2026
Each configured MCP server now registers as its own toolset in TOOLSETS
(e.g. TOOLSETS['github'] = {tools: ['mcp_github_list_files', ...]}),
making raw server names resolvable in platform_toolsets overrides.

Previously MCP tools were only injected into hermes-* umbrella toolsets,
so gateway sessions using raw toolset names like ['terminal', 'github']
in platform_toolsets couldn't resolve MCP tools.

Skips server names that collide with built-in toolsets. Also handles
idempotent reloads (syncs toolsets even when no new servers connect).

Inspired by PR NousResearch#1876 by @kshitijk4poor.
Adds 2 tests (standalone toolset creation + built-in collision guard).
02356abc pushed a commit to 02356abc/hermes-agent that referenced this pull request May 14, 2026
Each configured MCP server now registers as its own toolset in TOOLSETS
(e.g. TOOLSETS['github'] = {tools: ['mcp_github_list_files', ...]}),
making raw server names resolvable in platform_toolsets overrides.

Previously MCP tools were only injected into hermes-* umbrella toolsets,
so gateway sessions using raw toolset names like ['terminal', 'github']
in platform_toolsets couldn't resolve MCP tools.

Skips server names that collide with built-in toolsets. Also handles
idempotent reloads (syncs toolsets even when no new servers connect).

Inspired by PR NousResearch#1876 by @kshitijk4poor.
Adds 2 tests (standalone toolset creation + built-in collision guard).
olympus-terminal pushed a commit to olympus-terminal/hermes-agent that referenced this pull request May 16, 2026
Each configured MCP server now registers as its own toolset in TOOLSETS
(e.g. TOOLSETS['github'] = {tools: ['mcp_github_list_files', ...]}),
making raw server names resolvable in platform_toolsets overrides.

Previously MCP tools were only injected into hermes-* umbrella toolsets,
so gateway sessions using raw toolset names like ['terminal', 'github']
in platform_toolsets couldn't resolve MCP tools.

Skips server names that collide with built-in toolsets. Also handles
idempotent reloads (syncs toolsets even when no new servers connect).

Inspired by PR NousResearch#1876 by @kshitijk4poor.
Adds 2 tests (standalone toolset creation + built-in collision guard).
gweeteve pushed a commit to gweeteve/hermes-agent that referenced this pull request Jun 2, 2026
Each configured MCP server now registers as its own toolset in TOOLSETS
(e.g. TOOLSETS['github'] = {tools: ['mcp_github_list_files', ...]}),
making raw server names resolvable in platform_toolsets overrides.

Previously MCP tools were only injected into hermes-* umbrella toolsets,
so gateway sessions using raw toolset names like ['terminal', 'github']
in platform_toolsets couldn't resolve MCP tools.

Skips server names that collide with built-in toolsets. Also handles
idempotent reloads (syncs toolsets even when no new servers connect).

Inspired by PR NousResearch#1876 by @kshitijk4poor.
Adds 2 tests (standalone toolset creation + built-in collision guard).
Egavasyug pushed a commit to Egavasyug/hermes-agent that referenced this pull request Jun 10, 2026
Each configured MCP server now registers as its own toolset in TOOLSETS
(e.g. TOOLSETS['github'] = {tools: ['mcp_github_list_files', ...]}),
making raw server names resolvable in platform_toolsets overrides.

Previously MCP tools were only injected into hermes-* umbrella toolsets,
so gateway sessions using raw toolset names like ['terminal', 'github']
in platform_toolsets couldn't resolve MCP tools.

Skips server names that collide with built-in toolsets. Also handles
idempotent reloads (syncs toolsets even when no new servers connect).

Inspired by PR NousResearch#1876 by @kshitijk4poor.
Adds 2 tests (standalone toolset creation + built-in collision guard).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants