arcade-mcp/toolkits/stripe/arcade_stripe/tools/stripe.py
Eric Gustin c7fba25488
Add Stripe toolkit (#333)
| Name | Description | Package | Version |

|-----------------------------------|---------------------------------------------------------------------------|---------|---------|
| Stripe.CreateCustomer | This tool will create a customer in Stripe. |
Stripe | 0.0.1 |
| Stripe.ListCustomers | This tool will fetch a list of Customers from
Stripe. | Stripe | 0.0.1 |
| Stripe.CreateProduct | This tool will create a product in Stripe. |
Stripe | 0.0.1 |
| Stripe.ListProducts | This tool will fetch a list of Products from
Stripe. | Stripe | 0.0.1 |
| Stripe.CreatePrice | This tool will create a price in Stripe. If a
product has not already been | Stripe | 0.0.1 |
| Stripe.ListPrices | This tool will fetch a list of Prices from Stripe.
| Stripe | 0.0.1 |
| Stripe.CreatePaymentLink | This tool will create a payment link in
Stripe. | Stripe | 0.0.1 |
| Stripe.ListInvoices | This tool will list invoices in Stripe. | Stripe
| 0.0.1 |
| Stripe.CreateInvoice | This tool will create an invoice in Stripe. |
Stripe | 0.0.1 |
| Stripe.CreateInvoiceItem | This tool will create an invoice item in
Stripe. | Stripe | 0.0.1 |
| Stripe.FinalizeInvoice | This tool will finalize an invoice in Stripe.
| Stripe | 0.0.1 |
| Stripe.RetrieveBalance | This tool will retrieve the balance from
Stripe. It takes no input. | Stripe | 0.0.1 |
| Stripe.CreateRefund | This tool will refund a payment intent in
Stripe. | Stripe | 0.0.1 |
| Stripe.ListPaymentIntents | This tool will list payment intents in
Stripe. | Stripe | 0.0.1 |
| Stripe.CreateBillingPortalSession | This tool will create a billing
portal session. | Stripe | 0.0.1 |

-------------------------

This PR implements the tools in
[stripe-agent-toolkit](https://github.com/stripe/agent-toolkit)
verbatim. This means that the logic needed to implement these tools is
minimal since stripe has already done the heavy lifting.

The tools added in this toolkit are the same tools that are in the
stripe-agent-toolkit, but formatted as Arcade tools. This means that the
names of the tools, the parameter annotations, and tool docstrings are
taken from the stripe-agent-toolkit. I have omitted evals since the tool
definitions are taken from the stripe-agent-toolkit.

The tools in this PR are generated via a script. I have included this
script in the PR (`_generate.py`) so that if the stripe-agent-toolkit
ever adds more tools, then we can simply run that script to generate the
new tools.
2025-04-14 10:29:23 -07:00

196 lines
8.2 KiB
Python

from typing import Annotated
from arcade.sdk import ToolContext, tool
from stripe_agent_toolkit.api import StripeAPI
def run_stripe_tool(context: ToolContext, method_name: str, params: dict) -> str:
"""
Helper function that retrieves the Stripe secret key, initializes the API,
and executes the specified method with the provided parameters.
"""
api_key = context.get_secret("STRIPE_SECRET_KEY")
stripe_api = StripeAPI(secret_key=api_key, context=None)
params = {k: v for k, v in params.items() if v is not None}
return stripe_api.run(method_name, **params) # type: ignore[no-any-return]
@tool(requires_secrets=["STRIPE_SECRET_KEY"])
def create_customer(
context: ToolContext,
name: Annotated[str, "The name of the customer."],
email: Annotated[str | None, "The email of the customer."] = None,
) -> Annotated[str, "This tool will create a customer in Stripe."]:
"""This tool will create a customer in Stripe."""
return run_stripe_tool(context, "create_customer", {"name": name, "email": email})
@tool(requires_secrets=["STRIPE_SECRET_KEY"])
def list_customers(
context: ToolContext,
limit: Annotated[
int | None,
"A limit on the number of objects to be returned. Limit can range between 1 and 100.",
] = None,
email: Annotated[
str | None,
"A case-sensitive filter on the list based on the customer's email field. "
"The value must be a string.",
] = None,
) -> Annotated[str, "This tool will fetch a list of Customers from Stripe."]:
"""This tool will fetch a list of Customers from Stripe."""
return run_stripe_tool(context, "list_customers", {"limit": limit, "email": email})
@tool(requires_secrets=["STRIPE_SECRET_KEY"])
def create_product(
context: ToolContext,
name: Annotated[str, "The name of the product."],
description: Annotated[str | None, "The description of the product."] = None,
) -> Annotated[str, "This tool will create a product in Stripe."]:
"""This tool will create a product in Stripe."""
return run_stripe_tool(context, "create_product", {"name": name, "description": description})
@tool(requires_secrets=["STRIPE_SECRET_KEY"])
def list_products(
context: ToolContext,
limit: Annotated[
int | None,
"A limit on the number of objects to be returned. Limit can range between 1 and 100, "
"and the default is 10.",
] = None,
) -> Annotated[str, "This tool will fetch a list of Products from Stripe."]:
"""This tool will fetch a list of Products from Stripe."""
return run_stripe_tool(context, "list_products", {"limit": limit})
@tool(requires_secrets=["STRIPE_SECRET_KEY"])
def create_price(
context: ToolContext,
product: Annotated[str, "The ID of the product to create the price for."],
unit_amount: Annotated[int, "The unit amount of the price in cents."],
currency: Annotated[str, "The currency of the price."],
) -> Annotated[str, "This tool will create a price in Stripe. If a product has not already been"]:
"""This tool will create a price in Stripe. If a product has not already been"""
return run_stripe_tool(
context,
"create_price",
{"product": product, "unit_amount": unit_amount, "currency": currency},
)
@tool(requires_secrets=["STRIPE_SECRET_KEY"])
def list_prices(
context: ToolContext,
product: Annotated[str | None, "The ID of the product to list prices for."] = None,
limit: Annotated[
int | None,
"A limit on the number of objects to be returned. Limit can range between 1 and 100, "
"and the default is 10.",
] = None,
) -> Annotated[str, "This tool will fetch a list of Prices from Stripe."]:
"""This tool will fetch a list of Prices from Stripe."""
return run_stripe_tool(context, "list_prices", {"product": product, "limit": limit})
@tool(requires_secrets=["STRIPE_SECRET_KEY"])
def create_payment_link(
context: ToolContext,
price: Annotated[str, "The ID of the price to create the payment link for."],
quantity: Annotated[int, "The quantity of the product to include."],
) -> Annotated[str, "This tool will create a payment link in Stripe."]:
"""This tool will create a payment link in Stripe."""
return run_stripe_tool(context, "create_payment_link", {"price": price, "quantity": quantity})
@tool(requires_secrets=["STRIPE_SECRET_KEY"])
def list_invoices(
context: ToolContext,
customer: Annotated[str | None, "The ID of the customer to list invoices for."] = None,
limit: Annotated[
int | None,
"A limit on the number of objects to be returned. Limit can range between 1 and 100, "
"and the default is 10.",
] = None,
) -> Annotated[str, "This tool will list invoices in Stripe."]:
"""This tool will list invoices in Stripe."""
return run_stripe_tool(context, "list_invoices", {"customer": customer, "limit": limit})
@tool(requires_secrets=["STRIPE_SECRET_KEY"])
def create_invoice(
context: ToolContext,
customer: Annotated[str, "The ID of the customer to create the invoice for."],
days_until_due: Annotated[int | None, "The number of days until the invoice is due."] = None,
) -> Annotated[str, "This tool will create an invoice in Stripe."]:
"""This tool will create an invoice in Stripe."""
return run_stripe_tool(
context, "create_invoice", {"customer": customer, "days_until_due": days_until_due}
)
@tool(requires_secrets=["STRIPE_SECRET_KEY"])
def create_invoice_item(
context: ToolContext,
customer: Annotated[str, "The ID of the customer to create the invoice item for."],
price: Annotated[str, "The ID of the price for the item."],
invoice: Annotated[str, "The ID of the invoice to create the item for."],
) -> Annotated[str, "This tool will create an invoice item in Stripe."]:
"""This tool will create an invoice item in Stripe."""
return run_stripe_tool(
context, "create_invoice_item", {"customer": customer, "price": price, "invoice": invoice}
)
@tool(requires_secrets=["STRIPE_SECRET_KEY"])
def finalize_invoice(
context: ToolContext, invoice: Annotated[str, "The ID of the invoice to finalize."]
) -> Annotated[str, "This tool will finalize an invoice in Stripe."]:
"""This tool will finalize an invoice in Stripe."""
return run_stripe_tool(context, "finalize_invoice", {"invoice": invoice})
@tool(requires_secrets=["STRIPE_SECRET_KEY"])
def retrieve_balance(
context: ToolContext,
) -> Annotated[str, "This tool will retrieve the balance from Stripe. It takes no input."]:
"""This tool will retrieve the balance from Stripe. It takes no input."""
return run_stripe_tool(context, "retrieve_balance", {})
@tool(requires_secrets=["STRIPE_SECRET_KEY"])
def create_refund(
context: ToolContext,
payment_intent: Annotated[str, "The ID of the PaymentIntent to refund."],
amount: Annotated[int | None, "The amount to refund in cents."] = None,
) -> Annotated[str, "This tool will refund a payment intent in Stripe."]:
"""This tool will refund a payment intent in Stripe."""
return run_stripe_tool(
context, "create_refund", {"payment_intent": payment_intent, "amount": amount}
)
@tool(requires_secrets=["STRIPE_SECRET_KEY"])
def list_payment_intents(
context: ToolContext,
customer: Annotated[str | None, "The ID of the customer to list payment intents for."] = None,
limit: Annotated[
int | None,
"A limit on the number of objects to be returned. Limit can range between 1 and 100.",
] = None,
) -> Annotated[str, "This tool will list payment intents in Stripe."]:
"""This tool will list payment intents in Stripe."""
return run_stripe_tool(context, "list_payment_intents", {"customer": customer, "limit": limit})
@tool(requires_secrets=["STRIPE_SECRET_KEY"])
def create_billing_portal_session(
context: ToolContext,
customer: Annotated[str, "The ID of the customer to create the billing portal session for."],
return_url: Annotated[str | None, "The default URL to return to afterwards."] = None,
) -> Annotated[str, "This tool will create a billing portal session."]:
"""This tool will create a billing portal session."""
return run_stripe_tool(
context, "create_billing_portal_session", {"customer": customer, "return_url": return_url}
)