```ts
type FunctionToolCallback = (input, toolContext) =>
  | AsyncGenerator<JSONValue, JSONValue, never>
  | Promise<JSONValue>
  | JSONValue;
```

Defined in: [src/tools/function-tool.ts:52](https://github.com/strands-agents/harness-sdk/blob/576da59fdc411b55036a7cf66d4e1659a67d4d0d/strands-ts/src/tools/function-tool.ts#L52)

Callback function for FunctionTool implementations. The callback can return values in multiple ways, and FunctionTool handles the conversion to ToolResultBlock.

## Parameters

| Parameter | Type | Description |
| --- | --- | --- |
| `input` | `unknown` | The input parameters conforming to the tool’s inputSchema |
| `toolContext` | [`ToolContext`](/pr-cms-3708/docs/api/typescript/ToolContext/index.md) | The tool execution context with invocation state |

## Returns

| `AsyncGenerator`<[`JSONValue`](/pr-cms-3708/docs/api/typescript/JSONValue/index.md), [`JSONValue`](/pr-cms-3708/docs/api/typescript/JSONValue/index.md), `never`\> | `Promise`<[`JSONValue`](/pr-cms-3708/docs/api/typescript/JSONValue/index.md)\> | [`JSONValue`](/pr-cms-3708/docs/api/typescript/JSONValue/index.md)

Can return:

-   AsyncGenerator: Each yielded value becomes a ToolStreamEvent, final value wrapped in ToolResultBlock
-   Promise: Resolved value is wrapped in ToolResultBlock
-   Synchronous value: Value is wrapped in ToolResultBlock
-   If an error is thrown, it’s handled and returned as an error ToolResultBlock

## Example

```typescript
// Async generator example
async function* calculator(input: unknown, context: ToolContext) {
  yield 'Calculating...'
  const result = input.a + input.b
  yield `Result: ${result}`
  return result
}

// Promise example
async function fetchData(input: unknown, context: ToolContext) {
  const response = await fetch(input.url)
  return await response.json()
}

// Synchronous example
function multiply(input: unknown, context: ToolContext) {
  return input.a * input.b
}
```