Randoloot/addons/godot_mcp_toolkit/contract/mcp_toolkit_tool_context.gd
2026-10-09 12:49:07 +02:00

45 lines
1.7 KiB
GDScript

@tool
class_name MCPToolkitToolContext
extends RefCounted
## Per-invocation context for cancellable extension tool handlers.
##
## When a command is registered with
## [method MCPToolkitCommandOptions.mark_cancellable], the dispatcher passes an
## instance of this class as the handler's second argument. The handler observes
## cancellation cooperatively in one of two ways: reactively, by connecting to
## [signal cancelled] to abort a long-running operation; or by polling
## [method is_cancelled] between discrete steps. The dispatcher owns this object —
## do not store it beyond the handler's return, as it is scoped to a single tool
## invocation.
## Emitted once when the invocation is cancelled, for handlers that want to react
## immediately rather than poll [method is_cancelled].
signal cancelled
var _cancelled := false
## Requests cancellation: flips the cancelled state and emits [signal cancelled]
## (idempotent — a second call is ignored). [b]Called by the dispatch system[/b],
## not by extension handlers; a handler observes cancellation through
## [method is_cancelled] or [signal cancelled] instead of calling this.
func cancel() -> void:
if _cancelled:
return
_cancelled = true
cancelled.emit()
## Returns [code]true[/code] once the invocation has been cancelled. Poll it
## between steps of a long operation and return early when it is set.
## [codeblock]
## func _on_long_tool(parameters, ctx):
## for item in big_list:
## if ctx.is_cancelled():
## return MCPToolkitError.fail("FAILED", "cancelled")
## _process(item)
## return MCPToolkitSuccess.ok()
## [/codeblock]
func is_cancelled() -> bool:
return _cancelled