Changelog¶
This page documents all notable changes to the ToolRegistry project since the first release.
The format is based on Keep a Changelog, with project-specific grouping where useful.
[Unreleased]¶
[0.14.0] - 2026-07-16¶
Added¶
- Programmatic Tool Calling (PTC):
registry.ptc.enable()registers aprogrammatic_tool_calltool that lets LLMs write Python code with registered tools callable in the namespace.- Code runs in isolated subprocess via
codecell.IpcSubprocessRuntime - Tool calls forwarded to main process via bidirectional IPC
- AST validation blocks dangerous constructs
- Full permission and logging enforcement via
registry.invoke() - Two-layer isolation: ThreadBackend (outer, main process) + IpcSubprocessRuntime (inner, crash isolation)
- Code runs in isolated subprocess via
registry.ptccontroller: Always-present sub-object withenable(),disable(),enabled,last_invocation_id. Supports runtime injection for custom isolation backends.registry.invoke(tool_name, kwargs): Single-tool execution with full pipeline (permissions, logging). Canonical entry point for programmatic tool invocation.- Invocation tracking:
invocation_idfield on execution log entries with prefixestr_bat_(batch),tr_ptc_(PTC),tr_sig_(single invoke). Query withlog.get_entries(invocation_id=...). ToolMetadata.force_thread: Forces ThreadBackend for tools that need main-process access (e.g. PTC tool withregistry.invoke()callbacks).runtimes/bridge layer:ToolProjection,DirectProjection,validate_namespace(),namespace_to_callables()for bridging Tool objects to codecell.codecell>=0.2.1as optional[ptc]dependency.headersparameter forregister_from_mcp(#212): pass custom HTTP headers (e.g.Authorization: Bearer ...) to MCP servers using SSE or streamable-http transports. Available on bothregister_from_mcp()andregister_from_mcp_async().
Changed¶
- Unified execution helpers:
_check_tool_access()and_log_tool_result()shared by bothinvoke()andexecute_tool_calls()— no duplicated permission/logging logic. runtimes/no longer containsCodeResultorCodeRuntime— these are provided by thecodecellpackage.- Structured result types for
execute_tool_calls()(#202): returnsResultListofToolCallResult | ErrorResultinstead ofdict[str, str | list].ToolCallResult: successful result withid,name,resultfieldsErrorResult: failed result withid,name,message(uses"Type: detail"format like Python traceback)ResultList:listsubclass with O(1)by_id()andresults["call_id"]accessto_ir()/from_ir()methods for rosettaToolResultPartconversionbuild_tool_call_messages(tool_calls, results)— simplified signature, no legacy dict path
- Replaced Pydantic
ToolCallResultmodel andErrorResult(str)subclass with frozen dataclasses. ToolCall.to_ir()/ToolCall.from_ir()(#204): direct rosetta IRToolCallPartconversion onToolCall, symmetric with result types.api_format="rosetta-ir"(#207):get_schemas()andbuild_tool_call_messages()can now return rosetta IR types directly, skipping provider conversion.- Canonical
"openai-responses"format name: renamed from"openai-response"(singular) to align with rosetta convention. Old name preserved as deprecated alias."open-responses"added as silent alias. - Renamed LLM builder functions for clarity:
build_assistant_message→build_assistant_messagesbuild_tool_response→build_tool_result_messagesexpand_content_blocks→extract_multimodal_contentbuild_expanded_user_message→build_multimodal_user_message- Old names preserved as deprecated aliases with
DeprecationWarning.
Fixed¶
- Persistent MCP connection breaks in sync mode (#211): each sync tool call created and destroyed an ephemeral event loop, killing the persistent MCP transport bound to the previous loop.
MCPConnectionManagernow lazily starts a daemon thread with a persistent event loop on first sync call, keeping the connection alive across calls. Async callers are unaffected. - MCP/OpenAPI wrappers now survive cloudpickle serialization via
__getstate__/__setstate__(#189). - Fix
tytype error inintegrations/openapi/utils.py—headers.get()None guard. convert_tool_calls()argument loss (#205): passing an already-normalizedToolCallno longer re-parses through provider detection, which was losing arguments.
Dependencies¶
- Bump
llm-rosettaminimum from>=0.5.1,<0.7.0to>=0.7.1,<0.8.0.
Internal¶
- Update vendored
httpclientmodule from 0.4.1 to 0.4.4 (zerodep). - Update vendored
httpservermodule from 0.1.0 to 0.2.1 (zerodep).
[0.12.0] - 2026-06-26¶
Changed¶
- Unified Tool callable layer with
_FunctionToolWrapper: allTool.callablevalues are nowBaseToolWrappersubclasses, providing uniformcall_sync()/call_async()interfaces regardless of tool origin (native function, MCP, OpenAPI, LangChain). Tool.run()/Tool.arun()are now the primary API: exceptions propagate directly instead of being swallowed and returned as error strings. The old error-swallowing behavior (deprecated since v0.10.0) has been removed.Tool.run_raw()/Tool.arun_raw()are now deprecated aliases forrun()/arun(). They emitDeprecationWarningand will be removed in a future version.
Added¶
Tool.fnproperty: returns the underlying unwrapped function for native tools, or the wrapper itself for integration tools (MCP, OpenAPI, LangChain).- Sync/async transparency for all tools: sync tools can now be called via
arun()(dispatched viaasyncio.to_thread()), and async tools can be called viarun()(dispatched viaasyncio.run()). - Parallel execution support: mixed sync and async tools can be called concurrently via
asyncio.gather().
Removed¶
- Removed
make_sync_wrapper()from executor helpers (dead code after wrapper unification). - Removed async detection fallback in
ThreadBackendandProcessPoolBackendforBaseToolWrapperinstances (handled internally by wrappers).
Fixed¶
- Fixed
arun()/arun_raw()crashing on sync callables with "object can't be used in 'await' expression". - Fixed
run()/run_raw()returning bare coroutine objects for async callables instead of awaiting them. - Fixed executor context injection (
_ctxparameter) not detecting parameters through tool wrappers.
[0.11.2] - 2026-06-22¶
Added¶
- Added
tagsto_MUTABLE_METADATA_FIELDSfor runtime tag updates.
Fixed¶
- Simplified nullable
anyOfschemas for MCP compatibility.
[0.11.1] - 2026-05-31¶
Fixed¶
- Harden parameter schema generation so unresolved or unsupported annotations fall back per parameter instead of dropping the whole tool schema.
- Normalize empty or non-object tool parameter schemas to valid object schemas.
- Fix
discover_toolsschema generation for postponed annotations. - Normalize imported MCP input schemas and preserve richer OpenAPI schema details.
[0.11.0] - 2026-05-28¶
Added¶
-
Configurable tool name separator
- Add
name_sepsupport toToolRegistryfor deployments that need separators other than/in qualified tool names. - Expose name-separator configuration through declarative config loading and the admin panel.
- Add
-
Admin Schema and Discovery views
- Add a Schema tab in the admin panel with separate Global and Discover sub-tabs.
- Add a
discover_toolsview for inspecting discovery-related schemas and state. - Show visible, deferred, and disabled tool counts in the Schema tab.
-
Configurable discovery hints
- Add
search_hintsupport in YAML/config, admin editing, persistence, and discovery output. - Prefer
search_hintover first-sentence extraction indiscover_toolsresult bullets.
- Add
Fixed¶
- Sync
discover_toolsdescriptions when tools are enabled or disabled. - Support
/in tool and namespace names in admin API routes. - Fix
discover_enabledlogic so it checksis_enabled, not only registration state.
Changed¶
- Replace the admin version alert with a styled popup modal.
- Update project citation metadata and contributor workflow docs.
- Switch the complexipy pre-commit hook to the official
complexipy-pre-commithook with explicit file filtering.
[0.10.1] - 2026-05-18¶
Added¶
-
disable_by_tags()— Tag-based bulk disable (#158)- Add
disable_by_tags(tags, *, match="any", reason=...)toToolRegistryfor disabling tools in bulk by theirToolTagvalues match="any"(default): disables a tool if it has at least one of the specified tagsmatch="all": disables a tool only if it carries every specified tag- Already-disabled tools are skipped and not double-counted
- Returns a list of tool names that were newly disabled by this call
- Add
-
Post-registration hook (#159)
- Add
add_post_register_hook(hook)toToolRegistryfor registering hooks invoked after each tool is registered - Hook signature:
PostRegisterHook = Callable[[str, Tool, ToolRegistry], str | None] - Returning a non-empty string from a hook automatically disables the tool with that string as the reason; returning
Noneleaves the tool enabled - Multiple hooks are supported and invoked in registration order; exceptions inside hooks are caught and logged without propagating
PostRegisterHookis exported from thetoolregistrytop-level package
- Add
-
PythonSource.kwargs— constructor arguments in config (#160)- Add
kwargs: dict[str, Any]field to thepythontool source in declarative config files - Allows passing keyword arguments to the class constructor when a
classentry is loaded viaregister_from_class() - Supports environment variable interpolation (e.g.
"${API_KEY}") consistent with other config fields
- Add
Dependencies¶
- Update vendored
httpclientmodule from 0.4.0 to 0.4.1 (zerodep)
Refactoring¶
- Separate Tool.run() exception handling from LLM error formatting (#129, #149)
- Add
run_raw()andarun_raw()methods that raise exceptions instead of catching them run()andarun()now emitDeprecationWarningwhen they catch an exception and return an error string; userun_raw()/arun_raw()for programmatic error handling- Replace fragile
startswith("Error")string-prefix error detection with type-safe_ToolErrorsentinel pattern inexecute_tool_calls() - Add
TOOL_ERRORevent toChangeEventTypefor callback subscribers - Add
TIMEOUTstatus toExecutionStatusenum (separate fromERROR) - Add
exception_typeandtracebackfields toExecutionLogEntryfor structured error logging
- Add
Tests¶
- Improve edge-case coverage for complex type JSON Schema generation (#128, #150)
- Add 18 tests covering
Union,Literal,Annotated[T, Field(...)], nestedBaseModel,Enumsubclasses,Optional[list[...]], default mutable values,*args/**kwargswarnings, required field tracking, and mixed complex scenarios
- Add 18 tests covering
[0.9.1] - 2026-05-14¶
New Features¶
- Tool Source Tracking (#125, #130)
- Add
sourceandsource_detailfields toToolMetadatafor tracking tool provenance - Each integration auto-sets
sourceduring construction:"mcp","openapi","langchain", or"native"(default) source_detailcaptures transport info (MCP), base URL + path (OpenAPI), or class name (LangChain)
- Add
Bug Fixes¶
- Parameter Introspection Warnings (#126, #131)
- Emit
UserWarningwhen*argsor**kwargsparameters are skipped during JSON Schema generation - Emit
UserWarningwhen parameter model generation fails inTool.from_function(), instead of silently producing an empty schema
- Emit
Refactoring¶
- Extract route handlers from
setup_routes()to reduce complexity - Rename executor
ExecutionStatustoHandleStatus - Extract helpers from
execute_tool_calls()to reduce complexity
CI¶
- Add pre-commit with ruff, ty type check, and complexipy
- Split CI into lint + test jobs
- Add missing websockets dependency in test job
Docs¶
- Rewrite README as concise ecosystem landing page
- Add GitHub release badge
[0.9.0] - 2026-05-11¶
New Features¶
-
Admin Panel Enrichment (#133)
- Enrich tool API responses with full metadata:
ToolTagbadges,ToolMetadatafields (is_async,timeout,locality,think_augment,defer, etc.), and permission evaluation results - Add
GET /api/tools/{name}/permissionsendpoint for per-tool permission policy evaluation - Add tool detail modal in Web UI with tabbed view (Schema, Metadata, Permissions)
- Add system
ToolTagbadges (color-coded) and custom tag pills in tool rows - Replace single-letter meta icons (
T,D) with full-word badges (think,defer,async,local/remote) - Add search and tag-based filtering in the tools panel
- Improve mobile responsive layout with horizontal scroll and hidden reason column on small viewports
- Add 7 new tests covering enriched API and permissions endpoint
- Enrich tool API responses with full metadata:
-
Runtime Control for think_augment and defer (#134, #135)
- Add
update_tool_metadata(tool_name, **kwargs)andupdate_namespace_metadata(namespace, **kwargs)methods toToolRegistryfor runtime mutation ofthink_augmentanddeferfields - Whitelist approach: only
think_augmentanddeferare allowed for runtime modification (prevents unsafe mutations of execution-critical fields) - Add
PATCH /api/tools/{name}/metadataandPATCH /api/namespaces/{ns}/metadataREST API endpoints - Add interactive checkboxes in Web UI for
think_augmentanddeferin dedicated columns at both tool and namespace levels - Gray out Think checkbox for tools with native
thoughtparameter; exposehas_native_thoughtinget_tools_status()API - Namespace-level checkboxes apply to all tools within the namespace
- Add
METADATA_UPDATEevent type toChangeEventTypeenum - Add 7 new tests for metadata update endpoints
- Add
-
Admin Panel i18n (#137)
- Add bilingual support (English / Chinese) to the admin Web UI
- Language switcher dropdown in the header with
localStoragepersistence - All static text uses
data-i18nattributes; dynamic text usest(key, params)translation function - Covers all tabs, table headers, buttons, filters, toast messages, modal dialogs, and empty states
- Instant language switching with automatic re-rendering of the active tab
- Simplify connection status to dot-only indicator with hover tooltip
Refactoring¶
-
Remove PyYAML and jsonref Dependencies from OpenAPI (#140)
- Replace
PyYAMLwith zerodep vendored YAML parser in OpenAPI integration - Replace
jsonrefwith zerodep vendoredjsonschema.resolve_refs()for$refresolution - Remove all external dependencies from the
openapioptional extra - Vendor
zerodep/jsonschemav0.2.0 with full JSON Pointer (RFC 6901) support
- Replace
-
Remove httpx Core Dependency (#139)
- Replace
httpxwith zero-dependency vendored HTTP client for core OpenAPI functionality - Rename
HttpxClientConfig→HttpClientConfig(old name preserved as deprecated alias withDeprecationWarning) - Move
httpxfrom coredependenciesto[mcp]optional extras (MCP integration still requires it) - No changes to public API behavior —
HttpClientConfigaccepts the same constructor arguments
- Replace
-
Admin Panel Async Migration (#136)
- Migrate admin panel from stdlib
http.serverto zerodep's asynchttpservermodule (vendored viazerodep add httpserver) - Replace
BaseHTTPRequestHandlerwith decorator-based routing (@app.get,@app.post,@app.patch,@app.delete) - Unify authentication and CORS handling via
before_request/after_requestmiddleware - Run
asyncio.new_event_loop()in background thread instead ofHTTPServer.serve_forever() - Remove
AdminRequestHandlerclass (internal implementation detail replaced bysetup_routes()) - Simplify
TokenAuthto pure token management — HTTP enforcement moved to middleware - Exclude
_vendor/from ruff, ty, and complexipy checks inpyproject.toml
- Migrate admin panel from stdlib
[0.8.0] - 2026-05-02¶
New Features¶
- Declarative Tool Config Loader (#120, #122)
- Add
toolregistry.configmodule for parsing JSONC/YAML config files into typed frozen dataclasses - Support three tool source types:
python(class/module),mcp(stdio/sse/streamable-http),openapi(with auth) - Vendor
zerodep/jsoncandzerodep/yamlinto_vendor/package for zero external dependencies transport: "http"accepted as alias for"streamable-http"- Backward-compatible with legacy
{"module": "x", "class": "Y"}config format - Denylist/allowlist mode with per-source enable/disable and
token_envenvironment variable resolution
- Add
Refactoring¶
-
Integration Package Restructuring
- Moved
mcp/,openapi/,langchain/,native/integration packages under a newintegrations/parent package - New canonical import paths:
toolregistry.integrations.mcp,toolregistry.integrations.openapi,toolregistry.integrations.langchain,toolregistry.integrations.native - Old import paths (
toolregistry.mcp,toolregistry.openapi, etc.) preserved as deprecation shims that emitDeprecationWarning; these shims will be removed in a future release - Public
ToolRegistryAPI methods (register_from_mcp(),register_from_openapi(), etc.) are unchanged
- Moved
-
Consolidate Internal Modules
- Consolidate mixin modules into
_mixins/package - Consolidate zero-dependency vendored modules into
_vendor/package - Use subpackage-level imports for llm-rosetta ToolOps
- Consolidate mixin modules into
Bug Fixes¶
- Improve error message for classes with required constructor args (#127)
- Provide a clearer error message when
register_from_class()is called with a class whose constructor requires arguments
- Provide a clearer error message when
Maintenance¶
- Bump
llm-rosettaminimum to>=0.5.1,<0.6.0
[0.7.0] - 2026-04-06¶
New Features¶
-
Anthropic & Gemini Schema Format Support (#55, #88)
- Add
"anthropic"and"gemini"as validapi_formatvalues forget_schemas()andget_json_schema() - All schema conversion is powered by llm-rosetta, which also sanitizes JSON Schema keywords unsupported by each format
- Add
llm-rosetta>=0.2.6as a core dependency - Support parsing Anthropic
tool_useblocks and GeminifunctionCallparts inToolCall.from_tool_call() - Add
build_assistant_message()andbuild_tool_response()support for"anthropic"and"gemini"formats
- Add
-
Permission System (#79, #80, #81, #82)
- ToolTag & ToolMetadata (#80, #84): Add
ToolTagenum (READ_ONLY, DESTRUCTIVE, NETWORK, FILE_SYSTEM, SLOW, PRIVILEGED) andToolMetadatamodel with execution hints (is_async,is_concurrency_safe,timeout) and classification tags - Permission Handler Protocol (#81, #85): Add
PermissionHandlerandAsyncPermissionHandlerruntime-checkable protocols for tool authorization; addPermissionRequestandPermissionResulttypes; addset_permission_handler(),get_permission_handler(),remove_permission_handler()methods on ToolRegistry - Permission Rule Engine (#82, #86): Add
PermissionRuleandPermissionPolicymodels with first-match-wins evaluation; addset_permission_policy(),get_permission_policy(),remove_permission_policy()methods; add five built-in rules (ALLOW_READONLY,ASK_DESTRUCTIVE,DENY_PRIVILEGED,ASK_NETWORK,ASK_FILE_SYSTEM); permission checks integrated intoexecute_tool_calls() - Add
PERMISSION_DENIEDandPERMISSION_ASKEDevent types to the callback mechanism
- ToolTag & ToolMetadata (#80, #84): Add
-
ToolMetadata Locality (#89)
- Add
localityfield toToolMetadatawith values"local","remote", or"any"(default) - Enables classification of tools by execution location for filtering and scheduling
- Add
-
Tag-Based Filtering and Stable Sorting (#83)
- Add
tags,exclude_tags, andsortparameters toget_schemas() - Enables prompt-level tool filtering and deterministic ordering, reducing token waste and improving prompt cache hit rates with large tool pools
- Add
-
Persistent Connections for MCP and OpenAPI (#90)
- MCP integrations now maintain persistent connections across tool calls via
MCPConnectionManager - OpenAPI integrations reuse
httpxclient sessions for connection pooling - Add
ToolRegistry.close()/close_async()for explicit resource cleanup - Add context manager support:
with ToolRegistry() as reg:andasync with ToolRegistry() as reg:
- MCP integrations now maintain persistent connections across tool calls via
-
ToolDiscoveryTool for Progressive Tool Disclosure (#108, #114, #118)
- Add
ToolDiscoveryToolclass with dual-mode discovery: exact name match (returns full schema) and BM25F fuzzy search - Vendor zerodep
SparseIndexas_sparse_search.py(zero external dependencies) - Add
ToolMetadata.deferfield to mark tools for deferred loading (excluded from initial prompt) - Add
ToolMetadata.search_hintfield for free-form search keywords and synonyms - Index tool name, description, tags, parameter names, and search_hint with configurable field weights
- Add
enable_tool_discovery()/disable_tool_discovery()to registerdiscover_toolsas a first-class callable tool in the registry - Add
get_deferred_summaries()to get lightweight name + first-sentence description for deferred tools (for system prompt injection) - Add
include_deferredparameter toget_schemas()— set toFalseto exclude deferred tools from initial schemas - Discovery results for deferred tools include the full tool
schemaso LLMs can call them immediately after discovery - Auto-rebuild discovery index via ChangeCallback when tools are registered or unregistered
- Add
ToolRegistry(tool_discovery=True)constructor parameter for convenience
- Add
-
Think-Augmented Function Calling (#49)
- Inject a
thoughtstring property into tool parameter schemas so LLMs can include chain-of-thought reasoning when calling tools - Off by default — enable globally via
ToolRegistry(think_augment=True)or at runtime withenable_think_augment()/disable_think_augment() - Per-tool override via
ToolMetadata.think_augment(None=follow registry,True=force on,False=force off) - The property is automatically stripped before execution
- Native
thoughtparameters on functions are preserved (not overridden) - Covers all integration paths (MCP, OpenAPI, LangChain, native)
- Reference: arXiv:2601.18282
- Inject a
-
Result Size Management
- Add
ToolMetadata.max_result_sizeandToolRegistry(default_max_result_size=...)for automatic result truncation - Two strategies:
HEAD(keep first N chars) andHEAD_TAIL(keep first and last portions, default) - Full results automatically persisted to temporary files before truncation
- Add
truncate_result()function andTruncatedResultdataclass for programmatic use
- Add
Bug Fixes¶
- Gemini Tool Call ID and Name Resolution
- Fix
build_tool_call_messagesto align tool call IDs by position: IDs fromtool_responses(produced byexecute_tool_calls) are remapped onto the convertedToolCallobjects so assistant and tool messages reference the same IDs - Pass
tool_callstobuild_tool_responsefor GeminifunctionResponse.nameresolution - Previously, Gemini
functionResponse.nameshowed a random UUID instead of the function name becauseconvert_tool_calls()was called twice independently, generating different IDs each time
- Fix
Refactoring¶
-
Pluggable Executor Backend Architecture (#78)
- Replace monolithic
Executorclass with a pluggableexecutor/package - New
ExecutionBackendProtocol andExecutionHandleABC for backend extensibility ThreadBackend: thread-pool executor with cooperative cancellation viaExecutionContextProcessPoolBackend: process-pool executor with cloudpickle serializationToolMetadata.timeoutenforcement at the backend levelToolMetadata.is_concurrency_safecontrols sequential vs parallel batching- Tool functions can accept
_ctx: ExecutionContextfor cooperative cancellation and progress reporting
- Replace monolithic
-
Mixin-Based ToolRegistry Architecture (#94)
- Split
tool_registry.py(1459 lines) into 7 focused mixin classes (454 lines remaining) - Mixins:
ChangeCallbackMixin,NamespaceMixin,EnableDisableMixin,RegistrationMixin,PermissionsMixin,ExecutionLoggingMixin,AdminMixin - Public API unchanged; cooperative
__init__via MRO chain
- Split
-
Public API Rename (#107)
get_tools_json()→get_schemas()onToolRegistryrecover_tool_call_assistant_message()→build_tool_call_messages()onToolRegistryrecover_assistant_message()→build_assistant_message()(module-level)recover_tool_message()→build_tool_response()(module-level)with_namespaceparameter renamed tonamespacein allregister_from_*methods (old name still accepted with deprecation warning)set_execution_mode()renamed toset_default_execution_mode()(old name deprecated)list_all_tools()merged intolist_tools(include_disabled=True)(old name deprecated)- Add
"openai-chat"as canonical API format name; deprecate"openai"and"openai-chatcompletion" - All old names remain as deprecated aliases with
DeprecationWarning
[0.6.1] - 2026-03-22¶
Bug Fixes¶
- Fix
**kwargsleaking into tool JSON Schema:_generate_parameters_model()now skipsVAR_POSITIONAL(*args) andVAR_KEYWORD(**kwargs) parameters, preventing them from appearing as required fields in the generated schema. This fixes MCP tool calls failing with validation errors when tool functions use**kwargs.
Maintenance¶
- Switch
pyproject.tomlto dynamic versioning (read fromtoolregistry.__version__), consistent with toolregistry-server and toolregistry-hub.
[0.6.0] - 2026-03-18¶
⚠️ Breaking Changes¶
- Upgrade Minimum Python Version to 3.10 (#74)
- Update
requires-pythonfrom>=3.8to>=3.10 - Python 3.8 and 3.9 are no longer supported
- This aligns with Python 3.9 EOL and MCP SDK requirements
- Update
New Features¶
-
Admin Panel (Phase 7)
- Built-in web-based administration interface for ToolRegistry
- Execution logging with ring buffer storage
- REST API for tool and namespace management (12 endpoints)
- Web UI with Anthropic-style minimalist design
- Token-based authentication for remote access
- State export/import functionality
- New methods:
enable_admin(),disable_admin(),get_admin_info() - New methods:
enable_logging(),disable_logging(),get_execution_log() - New classes:
AdminServer,AdminInfo,TokenAuth - New classes:
ExecutionLog,ExecutionLogEntry,ExecutionStatus
-
Callback Mechanism (#68)
- Added
on_change()andremove_on_change()methods for monitoring registry changes - Supports callbacks for tool registration, removal, enable/disable events
- Added
-
Observability API
- Added
get_tools_status()method for inspecting tool states at runtime
- Added
Refactoring¶
-
Replace
dillwithcloudpickle(#76)- Swap
dill.dumps/dill.loadswithcloudpickle.dumps/pickle.loadsin executor - Deserialization now uses stdlib
pickle, so future remote executor targets only need Python stdlib - Replace
dill>=0.4.0dependency withcloudpickle>=3.0.0in pyproject.toml
- Swap
-
Modernize Type Annotations for Python 3.10+
- Replaced
Union[X, Y]withX | Ysyntax - Replaced
Optional[X]withX | None - Replaced
List,Dict,Tuplewith lowercaselist,dict,tuple
- Replaced
Maintenance¶
- Remove
fake-useragentdependency (no longer used after toolregistry-hub split) - Remove legacy
./docsdirectory (migrated todocs_en/docs_zhworktrees) - Add Python 3.10/3.11/3.12/3.13 classifiers to pyproject.toml
[0.5.0] - 2026-03-10¶
Refactoring¶
-
MCP Client Decoupled from fastmcp (#64, #65)
- Create
MCPClientadapter inmcp/client.pyusing the officialmcpSDK - Remove all
fastmcpimports fromintegration.py,utils.py, andtool_registry.py - Change
[mcp]extra dependency fromfastmcptomcp>=1.0.0 - Add v1/v2 dual compatibility for camelCase/snake_case attributes
- Support all four transports: stdio, SSE, streamable-http, websocket
- Add
headersparameter for HTTP authentication - Add 25 new tests covering
MCPClientfunctionality
- Create
-
Remove
toolregistry[hub]optional extra (#50, #56)- Remove
hub = ['toolregistry-hub>=0.4.14']from optional dependencies inpyproject.toml - Users should now install hub tools directly via
pip install toolregistry-hub - The
from toolregistry.hub import ...shim still works when both packages are installed - Update installation docs, hub integration docs, and README accordingly
- Remove
New Features¶
-
Enable/Disable with Reason Tracking (#53, #58)
- Add method-level and namespace-level disable with reason tracking
- New methods:
disable(name, reason),enable(name),is_enabled(tool_name),get_disable_reason(tool_name) list_tools()now only returns enabled tools- Add
list_tools(include_disabled=True)for admin panel use (returns all tools including disabled) get_tools_json()filters disabled tools when no specific tool_name givenexecute_tool_calls()returns error message for disabled tools instead of executing- Add 28 new tests
-
Namespace & MRO Support (#51, #52, #57)
- Add
namespace,method_namefields andqualified_nameproperty toToolmodel _update_sub_registries()now usesnamespacefield for grouping, eliminating-/_ambiguity- Add
traverse_mroparameter toregister_from_class()andregister_from_class_async() - Change
traverse_mrodefault toTrue— child class methods take priority over parent class methods
- Add
⚠️ Breaking Changes¶
register_from_class()now defaults totraverse_mro=True, meaning inherited public static and instance methods are registered automatically. Passtraverse_mro=Falseexplicitly to get the previous behavior
Maintenance¶
- Pin MCP SDK to
<2.0.0to avoid v2 breaking changes while support for the official MCP SDK v2 is being developed - Remove unused
beautifulsoup4dependency
[0.4.14] - 2025-08-11¶
New Features¶
-
Type System Refactor
- Modularize and extend type definitions
- Add custom tool call support
- Add comprehensive error handling and validation for tool call conversion
-
Hub Module Spinoff
- Migrate hub module to external package (
toolregistry-hub) - Add alternative import path for
toolregistry.hub - Update installation documentation with hub tools instructions
- Migrate hub module to external package (
Documentation Improvements¶
- Reorganize hub documentation and add new hub tools docs
- Add note about package split in version 0.4.14
[0.4.13] - 2025-06-20¶
New Features¶
-
OpenAI Response API Support
- Add
ResponseFunctionToolCallmodel - Add
api_modeparameter toget_tools_jsonfor JSON schema generation - Add
recover_tool_messagefunction - Add custom serializer for
resultfield - Add
ChatCompletionMessagemodel
- Add
-
Executor Improvements
- Add sync wrapper for async functions
- Add executor for tool call management
-
OpenAPI Enhancements
- Add
HttpxClientConfigto exports - Add overloads for httpx client creation
- Add
Refactoring¶
- Restructure tool call handling for cleaner architecture
- Streamline tool parameter validation
- Simplify FastMCP import and usage
- Unify API mode to API format
Bug Fixes¶
- Fix calculator: handle non-callable attributes correctly
- Fix integration: handle empty params gracefully
- Fix utils: resolve internal MCP server retrieval issue
- Fix executor: correct function type hint
- Fix toolregistry: handle event loop closure
- Fix parameter_models: correct field creation logic
- Fix toolregistry: correct typing for client configuration
Maintenance¶
- Update type checker from mypy to pyright
- Update dependency versions
- Update mcp dependency version range (Closes #36)
Documentation Improvements¶
- Add integration guides for OpenAI Chat Completion and Response API
- Add documentation for toolregistry modules
- Update MCP transport documentation
[0.4.12] - 2025-06-04¶
New Features¶
-
Calculator Refactor
- Spin off
BaseCalculatorfromCalculatorfor cleaner architecture
- Spin off
-
OpenAPI Integration
- Refactor OpenAPI integration to modular structure
- Add FastAPI as dev dependency
Refactoring¶
- Restructure class tool integration implementation
- Reorganize MCP integration code
- Reorganize LangChain integration
- Move util function to native module
Maintenance¶
- Deprecate labeled functions
- Update test cases for registry key format
Documentation Improvements¶
- Update OpenAPI integration guide and examples
- Regenerate Sphinx documentation after reorganization
[0.4.11] - 2025-06-03¶
New Features¶
-
Web Search Enhancements
- Add fetch tool to websearch module
- Add blocklist filtering for search results with GitHub raw proxy support
- Add accept header to mobile user agent
- Add real URL extraction from Bing redirects
-
Search Result Filtering (Closes #29)
- Improve search result filtering and blocklist caching mechanism
Bug Fixes¶
- Fix websearch_bing: adjust pagination parameters
- Fix websearch: handle domain separator in blocklist parsing
Documentation Improvements¶
- Add documentation for websearch and fetch tools
- Add documentation for websearch modules
[0.4.10] - 2025-05-23¶
New Features¶
-
Bing Search Integration
- Add Bing search functionality to websearch module
-
MCP Transport
- Add support for streamable-http transport mode
- Fix transport type handling in MCP integration
-
ToolSpec Refactor
- Streamline tool creation with
ToolSpec
- Streamline tool creation with
Bug Fixes¶
- Fix MCP tool name normalization raising error during execution (Closes #25)
Refactoring¶
- Centralize lynx header generation
- Rename header variables for consistency
Documentation Improvements¶
- Add Read the Docs configuration
- Restructure hub and examples documentation
- Add multilingual documentation support
- Add various example guides (consecutive tool calls, hub calculator, MCP, OpenAPI, LangChain)
[0.4.9] - 2025-05-21¶
New Features¶
-
LangChain Integration
- Add LangChain tool registration support
- Add LangChain integration module with arxiv example
-
Async Support
- Add asyncio support for method registration
- Refactor OpenAPI integration with async registration logic
-
Base Tool Wrapper
- Add
BaseToolWrapperabstract base class - Standardize tool wrapper inheritance
- Add
Refactoring¶
- Reorganize example files structure
- Replace print statements with logger.error
- Enhance base tool wrapper with ABC
Documentation Improvements¶
- Add LangChain integration guide
- Update README with LangChain integration documentation
[0.4.8.post1] - 2025-05-13¶
New Features¶
-
Calculator Enhancements
- Add
function_helpand expandevaluatecapabilities - Add utility to fetch static methods
- Add
-
Examples
- Add OpenAI calculator example
Documentation Improvements¶
- Update calculator tool documentation
- Add PyPI version badge to index page
[0.4.8] - 2025-05-11¶
New Features¶
-
Calculator
- Add Python version check for certain functions
-
OpenAPI
- Replace heavy openapi dependencies with lightweight ones
- Simplify spec parsing logic
Refactoring¶
- Clean up imports and type annotations
[0.4.7] - 2025-05-10¶
New Features¶
-
Google Search Tool
- Add Google search functionality to websearch hub
- Add enhanced content extraction methods
- Add general web search abstraction (
WebSearchGeneral)
-
MCP Transport
- Add support for multiple MCP transport modes (SSE, stdio, streamable-http)
- Add fastmcp-based math server and client
- Add diverse transport examples
-
Type Annotations
- Add type hinting support for toolregistry
Refactoring¶
- Migrate from
mcplibrary tofastmcp - Streamline exception handling and tool registration
- Reorganize websearch module structure
Documentation Improvements¶
- Update transport methods and tool registry documentation
- Add documentation for websearch modules
- Update MCP integration guide
[0.4.6.post2] - 2025-04-28¶
Bug Fixes¶
- Conditionally import
fake-useragentwhenpython>=3.9(fixes Python 3.8 compatibility) - Resolve import compatibility issues in websearch module
[0.4.6.post1] - 2025-04-28¶
New Features¶
- Add Google-based websearch hub tool
- Unify websearch with
WebSearchGeneralabstract class
Note: Use 0.4.6.post2 instead — this version has a dependency issue on Python 3.8.
[0.4.6] - 2025-04-28¶
New Features¶
-
SearXNG Web Search
- Add SearXNG-backed websearch hub tool
-
Type System
- Replicate OpenAI types with Pydantic in utils
Note: Use 0.4.6.post2 instead — this version has a dependency issue on Python 3.8.
[0.4.5] - 2025-04-17¶
New Features¶
-
Concurrent Tool Execution
- Add concurrent tool execution with
dillserialization
- Add concurrent tool execution with
-
Namespace Separator
- Refine namespace separator configuration
[0.4.4] - 2025-04-16¶
New Features¶
- Class Registration Method Upgrade
- Enhanced class-based tool registration
[0.4.3] - 2025-04-15¶
New Features¶
-
Calculator Enhanced Features
- Add enhanced calculator capabilities
-
File Operations
- Add file operations hub tool
- Refine FileSystem tool
[0.4.2] - 2025-04-14¶
Refactoring¶
- Namespace Refactor and Hub of Tools
- Refactor namespace handling
- Introduce hub of tools pattern
[0.4.1] - 2025-04-12¶
New Features¶
- Name Normalization
- Add name normalization for consistent tool naming
Refactoring¶
- Update README softlinks and testing examples for OpenAPI
[0.4.0] - 2025-04-05¶
New Features¶
- OpenAPI Support
- Add OpenAPI integration for tool registration from OpenAPI specs
Documentation Improvements¶
- Enhance docstrings for toolregistry
- Add comprehensive API documentation
[0.3.1] - 2025-04-04¶
New Features¶
- Unified Sync & Async Interface
- Unify the callable interface for sync and async mode
- Refine async calling mechanism for MCP
Documentation Improvements¶
- Add documentation files and generation script
[0.3.0] - 2025-04-01¶
New Features¶
- MCP Tools Support
- Add support for MCP SSE tools
- Add async and sync modes for running tools
- Add result post-processing for MCP tools
- Enhance tool management capabilities
Refactoring¶
- Improve tool lookup method
- Remove redundant execution methods
- Simplify tool run method result handling
Documentation Improvements¶
- Add MCP integration guide and usage examples
- Update installation requirements with MCP details
[0.2.0] - 2025-04-01¶
New Features¶
-
Parallel Tool Execution
- Add parallel execution for tool calls
-
Project Setup
- Migrate from
setup.pytopyproject.toml - Add version metadata
- Migrate from
Documentation Improvements¶
- Add Chinese README
- Update example file paths in documentation
[0.1.0] - 2025-04-01¶
Initial Release¶
- Initial spin-off from the cicada project
- Basic ToolRegistry implementation for managing and executing LLM tool calls
- Core tool registration and execution framework
- Support for Python function tools
Version Notes¶
Semantic Versioning¶
This project follows Semantic Versioning specification:
- Major version: Incompatible API changes
- Minor version: Backward-compatible functionality additions
- Patch version: Backward-compatible bug fixes
Change Type Legend¶
- New Features - New functionality or features
- Refactoring - Code refactoring without functional changes
- Bug Fixes - Error corrections
- Documentation - Documentation updates
- Maintenance - Maintenance updates
- Build - Build system changes
Getting Updates¶
To get the latest version, use:
Feedback and Suggestions¶
If you find any issues or have improvement suggestions, please submit an Issue in our GitHub repository.