Resolves TOO-388 <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Primarily metadata/dependency additions with no changes to core tool execution paths; risk is limited to potential packaging/import issues from the new `arcade-mcp-server` dependency. > > **Overview** > Adds `ToolMetadata` to tool decorators across the Bright Data, ClickHouse, MongoDB, Postgres, LinkedIn, Zendesk, and Math toolkits, specifying *behavior* (read-only/idempotency/destructive/open-world) and, where applicable, *service domain* classification. > > Updates each toolkit package to depend on `arcade-mcp-server` (plus local `uv` source wiring) and bumps toolkit versions accordingly; minor `__all__` ordering tweaks in Math/Zendesk are included. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 3bde3a061194e1d1b6a4e8a2ebd608b17984db4f. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
70 lines
1.6 KiB
Python
70 lines
1.6 KiB
Python
import decimal
|
|
import math
|
|
from decimal import Decimal
|
|
from typing import Annotated
|
|
|
|
from arcade_mcp_server.metadata import Behavior, ToolMetadata
|
|
from arcade_tdk import tool
|
|
|
|
decimal.getcontext().prec = 100
|
|
|
|
|
|
@tool(
|
|
metadata=ToolMetadata(
|
|
behavior=Behavior(
|
|
read_only=True,
|
|
destructive=False,
|
|
idempotent=True,
|
|
open_world=False,
|
|
),
|
|
),
|
|
)
|
|
def abs_val(
|
|
a: Annotated[str, "The number as a string"],
|
|
) -> Annotated[str, "The absolute value of the number as a string"]:
|
|
"""
|
|
Calculate the absolute value of a number
|
|
"""
|
|
# Use Decimal for arbitrary precision
|
|
return str(abs(Decimal(a)))
|
|
|
|
|
|
@tool(
|
|
metadata=ToolMetadata(
|
|
behavior=Behavior(
|
|
read_only=True,
|
|
destructive=False,
|
|
idempotent=True,
|
|
open_world=False,
|
|
),
|
|
),
|
|
)
|
|
def factorial(
|
|
a: Annotated[str, "The non-negative integer to compute the factorial for as a string"],
|
|
) -> Annotated[str, "The factorial of the number as a string"]:
|
|
"""
|
|
Compute the factorial of a non-negative integer
|
|
Returns "1" for "0"
|
|
"""
|
|
return str(math.factorial(int(a)))
|
|
|
|
|
|
@tool(
|
|
metadata=ToolMetadata(
|
|
behavior=Behavior(
|
|
read_only=True,
|
|
destructive=False,
|
|
idempotent=True,
|
|
open_world=False,
|
|
),
|
|
),
|
|
)
|
|
def sqrt(
|
|
a: Annotated[str, "The number to square root as a string"],
|
|
) -> Annotated[str, "The square root of the number as a string"]:
|
|
"""
|
|
Get the square root of a number
|
|
"""
|
|
# Use Decimal for arbitrary precision
|
|
a_decimal = Decimal(a)
|
|
return str(a_decimal.sqrt())
|