Class ToolRegistry
Registry for ITool instances that can be exposed to models/agents.
Tools are stored by their stable Name (case-sensitive, using Ordinal). The registry provides read-only enumeration of registered tools and name-based lookup.
public sealed class ToolRegistry
- Inheritance
-
ToolRegistry
- Inherited Members
Remarks
Responsibilities
- Enforces unique tool names with Ordinal.
- Performs minimal input-schema validation for each tool (must be a JSON object, optional
typeproperty should be"object"). - Supports synchronous and asynchronous bulk registration from an McpClient with optional filtering.
- Provides validation against a ToolCallPolicy prior to model invocation.
Thread-safety
This class is not thread-safe for concurrent writers. If you need to register or remove tools from multiple
threads, synchronize calls to Register(ITool, bool), Remove(string), and MCP-based overloads externally.
Concurrent reads after construction are safe as long as no further writes occur.
Typical usage:
var registry = new ToolRegistry();
registry.Register(new WeatherTool()); // default overwrite: false
if (registry.TryGet("get_weather", out var tool))
{
var args = "{\"location\":\"Toulouse, FR\"}";
var result = await tool.InvokeAsync(args, CancellationToken.None);
}
Tool names must be unique within the registry. Attempting to register a tool with a duplicate
name will throw an InvalidOperationException unless overwrite is set to true.
To avoid model confusion, keep names stable across versions (e.g., get_weather) and prefer lowercase snake_case.
Properties
- Count
Gets the total number of tools currently registered in this registry.
- Tools
Gets a read-only view of all tools currently registered in this registry.
Methods
- EnsureValid(ToolCallPolicy)
Validates the registry contents and (optionally) a ToolCallPolicy configuration before prompting a model or attempting tool invocation.
- Register(ITool, bool)
Registers a new ITool instance.
- Register(McpClient, bool, CancellationToken)
Registers all tools returned by the given McpClient using their original names.
- Register(McpClient, Func<McpTool, bool>, bool, CancellationToken)
Registers all tools returned by the given McpClient with an optional filter and overwrite behavior.
- Register(IEnumerable<ITool>, bool)
Registers a batch of ITool instances.
- Register(object, bool)
Registers all ITools discovered on the specified
instancefrom instance methods annotated with LMFunctionAttribute.
- Register(object, MethodInfo, bool)
Registers a single ITool built from a specific
methodon the providedinstance. The method must be annotated with LMFunctionAttribute.
- Register(Assembly, bool)
Registers all ITools discovered across all types in the given
assemblythat expose instance methods annotated with LMFunctionAttribute.
- Register(Type, bool)
Registers all ITools discovered on a newly created instance of the specified
type. Thetypemust have a public parameterless constructor and contain instance methods annotated with LMFunctionAttribute.
- RegisterAsync(McpClient, bool, CancellationToken)
Registers all tools returned by the given McpClient using their original names.
- RegisterAsync(McpClient, Func<McpTool, bool>, bool, CancellationToken)
Registers all tools returned by the given McpClient using their original names, with an optional filter and overwrite behavior.
- Register<T>(bool)
Registers all ITools discovered on a newly created instance of
T. The type must have a public parameterless constructor and contain instance methods annotated with LMFunctionAttribute.
- Remove(IEnumerable<ITool>)
Removes multiple tools from this registry.
- Remove(string)
Removes a previously registered tool by its exact Name.
- TryGet(string, out ITool)
Attempts to retrieve a registered tool by its Name.