Finta is the user's bookkeeping. To upload bank or card transactions: parse the whole file yourself, compute its row count and net total, then call upload_transactions in chunks of up to 500 rows. Send every row, and mark rows you leave out with exclude. Resolve errors, warnings and open questions from the file and context. Ask the user only when you truly can't tell, and otherwise use the suggested defaults. When you're done, tell the user what was uploaded and what was left out. Tools marked "Not available to this company yet (early access: X)" belong to feature X, which this company doesn't have yet; that isn't a failure to report. Don't call them. If the user asks for something they do, say once that the feature isn't available to them yet and offer to request access; only if they agree, send one submit_feedback request per feature, not one per tool. Otherwise, when no Finta tool can do what the user asked, or a Finta tool fails unexpectedly or misleads you, report it with submit_feedback (reported_by: agent) without asking first, tell the user in one line, and carry on. Use submit_feedback too when the user wants to send Finta a question, feedback or bug. If submit_feedback itself fails, don't retry or report that; tell the user they can email [email protected].
Protocol
Pass100/10020 / 20 pts
Connection, authentication, and protocol compatibility.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: Get the details of the company this connection is signed in to: its display name, legal name, entity type, incorporation and legal address.
Not for: Financial figures, accounts, the team or connected integrations. The full EIN is never returned, only its last four digits.
Returns: id, name (the display name), legal_name, entity_type (c_corp, pbc, llc, s_corp or other), federal_ein_last4, delaware_file_number, incorporation (date and state), legal_address and created.
When to use: "What's our legal name?", "When were we incorporated?", "What's our registered address?", or to confirm which company you're working in before making changes.
Workflow: Use name when talking to the user and legal_name only where the legal name is asked for.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_company",
"title": "Get company",
"description": "Purpose: Get the details of the company this connection is signed in to: its display name, legal name, entity type, incorporation and legal address.\nNot for: Financial figures, accounts, the team or connected integrations. The full EIN is never returned, only its last four digits.\nReturns: id, name (the display name), legal_name, entity_type (c_corp, pbc, llc, s_corp or other), federal_ein_last4, delaware_file_number, incorporation (date and state), legal_address and created.\nWhen to use: \"What's our legal name?\", \"When were we incorporated?\", \"What's our registered address?\", or to confirm which company you're working in before making changes.\nWorkflow: Use name when talking to the user and legal_name only where the legal name is asked for.",
"inputSchema": {
"type": "object",
"properties": {},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: List the company's chart of accounts in Finta, from top-level account types down to detail categories, with their stable cat_ IDs.
Not for: Amounts, balances or transactions; categories carry no totals. Departments are a separate list.
Returns: Every category in one response, ordered by tier, position and name. Each has id, name, account_type (asset, liability, equity, income or expense), tier (1 is top level), parent_id, and point_in_time (true for balance sheet categories).
When to use: "What categories do we use?", "Where do software subscriptions go?", or to find the cat_ ID of a category the user names.
Workflow: Use parent_id to place a category under its parent. Names can repeat under different parents, so check the parent before picking one, and refer to categories by id.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_categories",
"title": "List categories",
"description": "Purpose: List the company's chart of accounts in Finta, from top-level account types down to detail categories, with their stable cat_ IDs.\nNot for: Amounts, balances or transactions; categories carry no totals. Departments are a separate list.\nReturns: Every category in one response, ordered by tier, position and name. Each has id, name, account_type (asset, liability, equity, income or expense), tier (1 is top level), parent_id, and point_in_time (true for balance sheet categories).\nWhen to use: \"What categories do we use?\", \"Where do software subscriptions go?\", or to find the cat_ ID of a category the user names.\nWorkflow: Use parent_id to place a category under its parent. Names can repeat under different parents, so check the parent before picking one, and refer to categories by id.",
"inputSchema": {
"type": "object",
"properties": {},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: List the company's departments in Finta, such as Engineering or Sales, with their stable dept_ IDs.
Not for: Categories or the chart of accounts, which are a separate list. Departments carry no amounts.
Returns: Every department in one response, in display order. Each has id, name, tier (1 is top level), parent_id, and assignable.
When to use: "Which departments do we track?", or to find the dept_ ID of a department the user names.
Workflow: Only departments with assignable: true can be assigned to a transaction; the others are groups. Use parent_id to place a department under its group, and refer to departments by id.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_departments",
"title": "List departments",
"description": "Purpose: List the company's departments in Finta, such as Engineering or Sales, with their stable dept_ IDs.\nNot for: Categories or the chart of accounts, which are a separate list. Departments carry no amounts.\nReturns: Every department in one response, in display order. Each has id, name, tier (1 is top level), parent_id, and assignable.\nWhen to use: \"Which departments do we track?\", or to find the dept_ ID of a department the user names.\nWorkflow: Only departments with assignable: true can be assigned to a transaction; the others are groups. Use parent_id to place a department under its group, and refer to departments by id.",
"inputSchema": {
"type": "object",
"properties": {},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Purpose: Invite someone to the company's Finta team with the access they should have. Finta emails them a link to join.
Not for: Changing a pending invitation's access (update_team_invitation) or sending its email again (resend_team_invitation). People who already joined; they're managed in the Finta web app.
Returns: invitation, the same object get_team lists, with its invite_ ID; created, true for a new invitation and false when the same invitation was already pending; and changed, true when a repeat renewed an expired invitation or retried its email.
When to use: "Invite [email protected] as an admin", "Give our accountant read-only access to Finta".
Workflow: Confirm the person's name, email and access with the user before inviting. Inviting with the same details again is safe and returns the pending invitation; a different pending invitation or an existing teammate with that email is refused (invitation_invalid). You can't grant more access than the signed-in user has (insufficient_permission). read_only and custom need the Growth plan (plan_upgrade_required) and custom roles to be on for the company (feature_disabled); otherwise only admin is available, so tell the user rather than reporting it.
The description explains the capability, when to use it, and what to expect.
Inputs4/100
1 of 18 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
first_name
Not provided
Missing description. Explain what this value means and how to supply it.
last_name
Not provided
Missing description. Explain what this value means and how to supply it.
email
Not provided
Missing description. Explain what this value means and how to supply it.
access_template
admin manages everything; read_only views everything but has no API access; custom takes permissions.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
permissions › dashboard
Not provided
Missing description. Explain what this value means and how to supply it.
permissions › transactions
Not provided
Missing description. Explain what this value means and how to supply it.
permissions › accounting_setup
Not provided
Missing description. Explain what this value means and how to supply it.
permissions › reconciliation
Not provided
Missing description. Explain what this value means and how to supply it.
permissions › invoices
Not provided
Missing description. Explain what this value means and how to supply it.
permissions › reports
Not provided
Missing description. Explain what this value means and how to supply it.
permissions › forecast
Not provided
Missing description. Explain what this value means and how to supply it.
permissions › taxes
Not provided
Missing description. Explain what this value means and how to supply it.
permissions › integrations
Not provided
Missing description. Explain what this value means and how to supply it.
permissions › company
Not provided
Missing description. Explain what this value means and how to supply it.
permissions › team_access
Not provided
Missing description. Explain what this value means and how to supply it.
permissions › billing
Not provided
Missing description. Explain what this value means and how to supply it.
permissions › ask_finta
Not provided
Missing description. Explain what this value means and how to supply it.
permissions › api_access
Not provided
Missing description. Explain what this value means and how to supply it.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "create_team_invitation",
"title": "Invite team member",
"description": "Purpose: Invite someone to the company's Finta team with the access they should have. Finta emails them a link to join.\nNot for: Changing a pending invitation's access (update_team_invitation) or sending its email again (resend_team_invitation). People who already joined; they're managed in the Finta web app.\nReturns: invitation, the same object get_team lists, with its invite_ ID; created, true for a new invitation and false when the same invitation was already pending; and changed, true when a repeat renewed an expired invitation or retried its email.\nWhen to use: \"Invite [email protected] as an admin\", \"Give our accountant read-only access to Finta\".\nWorkflow: Confirm the person's name, email and access with the user before inviting. Inviting with the same details again is safe and returns the pending invitation; a different pending invitation or an existing teammate with that email is refused (invitation_invalid). You can't grant more access than the signed-in user has (insufficient_permission). read_only and custom need the Growth plan (plan_upgrade_required) and custom roles to be on for the company (feature_disabled); otherwise only admin is available, so tell the user rather than reporting it.",
"inputSchema": {
"type": "object",
"required": [
"first_name",
"last_name",
"email",
"access_template"
],
"properties": {
"email": {
"type": "string",
"minLength": 1
},
"last_name": {
"type": "string",
"minLength": 1
},
"first_name": {
"type": "string",
"minLength": 1
},
"permissions": {
"type": "object",
"required": [
"dashboard",
"transactions",
"accounting_setup",
"reconciliation",
"invoices",
"reports",
"forecast",
"taxes",
"integrations",
"company",
"team_access",
"billing",
"ask_finta",
"api_access"
],
"properties": {
"taxes": {
"enum": [
"none",
"view",
"manage"
],
"type": "string"
},
"billing": {
"enum": [
"none",
"view",
"manage"
],
"type": "string"
},
"company": {
"enum": [
"none",
"view",
"manage"
],
"type": "string"
},
"reports": {
"enum": [
"none",
"view",
"manage"
],
"type": "string"
},
"forecast": {
"enum": [
"none",
"view",
"manage"
],
"type": "string"
},
"invoices": {
"enum": [
"none",
"view",
"manage"
],
"type": "string"
},
"ask_finta": {
"enum": [
"none",
"view",
"manage"
],
"type": "string"
},
"dashboard": {
"enum": [
"none",
"view",
"manage"
],
"type": "string"
},
"api_access": {
"enum": [
"none",
"manage"
],
"type": "string"
},
"team_access": {
"enum": [
"none",
"view",
"manage"
],
"type": "string"
},
"integrations": {
"enum": [
"none",
"view",
"manage"
],
"type": "string"
},
"transactions": {
"enum": [
"none",
"view",
"manage"
],
"type": "string"
},
"reconciliation": {
"enum": [
"none",
"view",
"manage"
],
"type": "string"
},
"accounting_setup": {
"enum": [
"none",
"view",
"manage"
],
"type": "string"
}
},
"description": "Only with access_template custom, and then required: every area, each none, view or manage. api_access is none or manage.",
"additionalProperties": false
},
"access_template": {
"enum": [
"admin",
"read_only",
"custom"
],
"type": "string",
"description": "admin manages everything; read_only views everything but has no API access; custom takes permissions."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: List the company's team: active and inactive members, and pending invitations, with each person's access.
Not for: Changing anyone's access. Members are managed in the Finta web app; pending invitations with create_team_invitation, update_team_invitation, resend_team_invitation and revoke_team_invitation.
Returns: members (id, email, name, state active or inactive, access_template, permissions, created) and invitations (id, email, name, access_template, permissions, invited_by, created, expires), in the order the Settings team page shows them. access_template is admin, read_only or custom; permissions gives every area's level (none, view or manage), so read it for custom access. Timestamps are Unix seconds; an invitation whose expires has passed is expired but still pending. An id can be null when it isn't available.
When to use: "Who's on our Finta team?", "Who has admin access?", "Did Sam accept the invite?", or to find the invite_ ID of an invitation to change, resend or revoke.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_team",
"title": "Get team",
"description": "Purpose: List the company's team: active and inactive members, and pending invitations, with each person's access.\nNot for: Changing anyone's access. Members are managed in the Finta web app; pending invitations with create_team_invitation, update_team_invitation, resend_team_invitation and revoke_team_invitation.\nReturns: members (id, email, name, state active or inactive, access_template, permissions, created) and invitations (id, email, name, access_template, permissions, invited_by, created, expires), in the order the Settings team page shows them. access_template is admin, read_only or custom; permissions gives every area's level (none, view or manage), so read it for custom access. Timestamps are Unix seconds; an invitation whose expires has passed is expired but still pending. An id can be null when it isn't available.\nWhen to use: \"Who's on our Finta team?\", \"Who has admin access?\", \"Did Sam accept the invite?\", or to find the invite_ ID of an invitation to change, resend or revoke.",
"inputSchema": {
"type": "object",
"properties": {},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: Email a pending invitation again with a fresh link, extending its expiry. Works for expired invitations too.
Not for: Changing who it's for or their access (update_team_invitation). People who already joined.
Returns: invitation, the same object get_team lists, with its new expires, and changed, normally true. Neither means the email has arrived.
When to use: "Sam never got the invite", "Sam's invitation expired, send it again".
Workflow: Find the invitation's invite_ ID with get_team. Each call sends another email and replaces the earlier link, so call it once per request, and don't retry an uncertain result unless the user is fine with another email. An accepted invitation is refused (resource_missing).
The description explains the capability, when to use it, and what to expect.
Inputs97/100
Input documentation gives an agent enough context to populate the arguments.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "resend_team_invitation",
"title": "Resend team invitation",
"description": "Purpose: Email a pending invitation again with a fresh link, extending its expiry. Works for expired invitations too.\nNot for: Changing who it's for or their access (update_team_invitation). People who already joined.\nReturns: invitation, the same object get_team lists, with its new expires, and changed, normally true. Neither means the email has arrived.\nWhen to use: \"Sam never got the invite\", \"Sam's invitation expired, send it again\".\nWorkflow: Find the invitation's invite_ ID with get_team. Each call sends another email and replaces the earlier link, so call it once per request, and don't retry an uncertain result unless the user is fine with another email. An accepted invitation is refused (resource_missing).",
"inputSchema": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The invite_ ID from get_team."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: Cancel a pending invitation, so its link no longer lets the person join.
Not for: Removing someone who already joined; the API refuses an accepted invitation (resource_missing), and members are managed in the Finta web app.
Returns: revoked: true and the invitation's id. An invitation that was already revoked, or that doesn't exist, returns the same.
When to use: "Cancel the invite to [email protected]", "We sent that invite to the wrong address".
Workflow: Find the invitation with get_team, show the user who it's for, and get their confirmation before revoking.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Input documentation gives an agent enough context to populate the arguments.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "revoke_team_invitation",
"title": "Revoke team invitation",
"description": "Purpose: Cancel a pending invitation, so its link no longer lets the person join.\nNot for: Removing someone who already joined; the API refuses an accepted invitation (resource_missing), and members are managed in the Finta web app.\nReturns: revoked: true and the invitation's id. An invitation that was already revoked, or that doesn't exist, returns the same.\nWhen to use: \"Cancel the invite to [email protected]\", \"We sent that invite to the wrong address\".\nWorkflow: Find the invitation with get_team, show the user who it's for, and get their confirmation before revoking.",
"inputSchema": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The invite_ ID from get_team."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: Change the access a pending invitation will give the person once they join.
Not for: Changing the invitee's name or email; revoke the invitation and create a new one. Sending the email again (resend_team_invitation). People who already joined; they're managed in the Finta web app.
Returns: invitation, the same object get_team lists, and changed, false when the access was already what you sent.
When to use: "Make Sam's invite read-only instead", "Give the pending invite for our accountant Reports: View only".
Workflow: Find the invitation's invite_ ID and current access with get_team, and confirm the change with the user. The access you send replaces the old access entirely. Needs the Growth plan (plan_upgrade_required), and you can't grant more access than the signed-in user has (insufficient_permission). An accepted invitation is refused (resource_missing).
The description explains the capability, when to use it, and what to expect.
Inputs13/100
2 of 16 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
id
The invite_ ID from get_team.
Clear enough to supply this argument.
access_template
admin manages everything; read_only views everything but has no API access; custom takes permissions.
Clear enough to supply this argument.
permissions › dashboard
Not provided
Missing description. Explain what this value means and how to supply it.
permissions › transactions
Not provided
Missing description. Explain what this value means and how to supply it.
permissions › accounting_setup
Not provided
Missing description. Explain what this value means and how to supply it.
permissions › reconciliation
Not provided
Missing description. Explain what this value means and how to supply it.
permissions › invoices
Not provided
Missing description. Explain what this value means and how to supply it.
permissions › reports
Not provided
Missing description. Explain what this value means and how to supply it.
permissions › forecast
Not provided
Missing description. Explain what this value means and how to supply it.
permissions › taxes
Not provided
Missing description. Explain what this value means and how to supply it.
permissions › integrations
Not provided
Missing description. Explain what this value means and how to supply it.
permissions › company
Not provided
Missing description. Explain what this value means and how to supply it.
permissions › team_access
Not provided
Missing description. Explain what this value means and how to supply it.
permissions › billing
Not provided
Missing description. Explain what this value means and how to supply it.
permissions › ask_finta
Not provided
Missing description. Explain what this value means and how to supply it.
permissions › api_access
Not provided
Missing description. Explain what this value means and how to supply it.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: Create a manual bank or credit card account in Finta that transactions can be uploaded to.
Not for: Accounts that sync from an integration such as Mercury, Brex or Plaid; those already exist, and creating one here makes a separate manual account. Adds no transactions or categories.
Returns: The account (id, account_name, vendor, type) and created: true, or created: false when a matching manual account already existed.
When to use: The user wants to add transactions for an account Finta doesn't have yet, such as "set up our Chase checking account".
Workflow: Call list_accounts first and use the existing account if one matches. Confirm the bank, name and type with the user when they're unclear. Calling again with the same vendor, account_name and type returns the same account, so retrying is safe.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
account_name
Display name, such as "Chase Checking 4821". Include the last four digits when known.
Clear enough to supply this argument.
vendor
The bank or card issuer, such as "chase" or "amex".
Clear enough to supply this argument.
type
"bank" for a checking or savings account, "credit" for a credit card.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "create_account",
"title": "Create account",
"description": "Purpose: Create a manual bank or credit card account in Finta that transactions can be uploaded to.\nNot for: Accounts that sync from an integration such as Mercury, Brex or Plaid; those already exist, and creating one here makes a separate manual account. Adds no transactions or categories.\nReturns: The account (id, account_name, vendor, type) and created: true, or created: false when a matching manual account already existed.\nWhen to use: The user wants to add transactions for an account Finta doesn't have yet, such as \"set up our Chase checking account\".\nWorkflow: Call list_accounts first and use the existing account if one matches. Confirm the bank, name and type with the user when they're unclear. Calling again with the same vendor, account_name and type returns the same account, so retrying is safe.",
"inputSchema": {
"type": "object",
"required": [
"account_name",
"vendor",
"type"
],
"properties": {
"type": {
"enum": [
"bank",
"credit"
],
"type": "string",
"description": "\"bank\" for a checking or savings account, \"credit\" for a credit card."
},
"vendor": {
"type": "string",
"minLength": 1,
"description": "The bank or card issuer, such as \"chase\" or \"amex\"."
},
"account_name": {
"type": "string",
"minLength": 1,
"description": "Display name, such as \"Chase Checking 4821\". Include the last four digits when known."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: List the company's bank, credit card and other transaction-source accounts in Finta, with their stable acct_ IDs.
Not for: Chart-of-accounts categories, balances or transactions. An account being listed does not mean its bank connection is currently working.
Returns: One page of accounts, each with id, account_name, vendor and type (such as bank or credit), plus has_more and next_cursor.
When to use: "Which accounts do we have in Finta?", or to find the acct_ ID of an account the user names.
Workflow: If has_more is true, call again with starting_after set to next_cursor, unchanged. Names can repeat or change, so refer to accounts by id.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Accounts per page, from 1 to 500. Defaults to 100.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
starting_after
The next_cursor from the previous page, unchanged. Omit it for the first page. Never an account ID.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_accounts",
"title": "List accounts",
"description": "Purpose: List the company's bank, credit card and other transaction-source accounts in Finta, with their stable acct_ IDs.\nNot for: Chart-of-accounts categories, balances or transactions. An account being listed does not mean its bank connection is currently working.\nReturns: One page of accounts, each with id, account_name, vendor and type (such as bank or credit), plus has_more and next_cursor.\nWhen to use: \"Which accounts do we have in Finta?\", or to find the acct_ ID of an account the user names.\nWorkflow: If has_more is true, call again with starting_after set to next_cursor, unchanged. Names can repeat or change, so refer to accounts by id.",
"inputSchema": {
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 500,
"minimum": 1,
"description": "Accounts per page, from 1 to 500. Defaults to 100."
},
"starting_after": {
"type": "string",
"description": "The next_cursor from the previous page, unchanged. Omit it for the first page. Never an account ID."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: List the company's individual corporate cards from Brex, Ramp, Mercury, Slash and Rho, with their stable card_ IDs.
Not for: Bank accounts or card accounts, which list_accounts returns. Plaid credit cards appear there as accounts, not here. A card being listed does not mean its integration is currently working.
Returns: One page of cards, each with id, account_id, name, last_four, type (physical or virtual) and status (active or inactive), plus has_more and next_cursor. Inactive and deleted cards are included. Every field but id can be null when it isn't known; Rho cards always have a null account_id, last_four, type and status. Rho cards are known only from their past transactions, so a Rho card that has never been used is missing: when the company uses Rho, don't present the list as every card it has.
When to use: "Which cards do we have?", "Which card ends in 4821?", or to find the card_ ID of a card the user names.
Workflow: Pass account_id from list_accounts to list only the cards linked to that account. Ramp and Rho cards are never linked to an account, so they appear only without account_id, and an empty filtered list doesn't mean the account has no cards. If has_more is true, call again with starting_after set to next_cursor, unchanged, and the same account_id. Names can repeat or be missing, so match on last_four when the user gives it, and refer to cards by id.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
account_id
Only cards linked to this account, never Ramp or Rho cards: an acct_ ID from list_accounts. Omit it for every card.
Clear enough to supply this argument.
limit
Cards per page, from 1 to 500. Defaults to 100.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
starting_after
The next_cursor from the previous page, unchanged. Omit it for the first page. Never a card ID.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_cards",
"title": "List cards",
"description": "Purpose: List the company's individual corporate cards from Brex, Ramp, Mercury, Slash and Rho, with their stable card_ IDs.\nNot for: Bank accounts or card accounts, which list_accounts returns. Plaid credit cards appear there as accounts, not here. A card being listed does not mean its integration is currently working.\nReturns: One page of cards, each with id, account_id, name, last_four, type (physical or virtual) and status (active or inactive), plus has_more and next_cursor. Inactive and deleted cards are included. Every field but id can be null when it isn't known; Rho cards always have a null account_id, last_four, type and status. Rho cards are known only from their past transactions, so a Rho card that has never been used is missing: when the company uses Rho, don't present the list as every card it has.\nWhen to use: \"Which cards do we have?\", \"Which card ends in 4821?\", or to find the card_ ID of a card the user names.\nWorkflow: Pass account_id from list_accounts to list only the cards linked to that account. Ramp and Rho cards are never linked to an account, so they appear only without account_id, and an empty filtered list doesn't mean the account has no cards. If has_more is true, call again with starting_after set to next_cursor, unchanged, and the same account_id. Names can repeat or be missing, so match on last_four when the user gives it, and refer to cards by id.",
"inputSchema": {
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 500,
"minimum": 1,
"description": "Cards per page, from 1 to 500. Defaults to 100."
},
"account_id": {
"type": "string",
"description": "Only cards linked to this account, never Ramp or Rho cards: an acct_ ID from list_accounts. Omit it for every card."
},
"starting_after": {
"type": "string",
"description": "The next_cursor from the previous page, unchanged. Omit it for the first page. Never a card ID."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: Make the same change to many transactions at once, up to 5,000, chosen by txn_ IDs or by filters: such as recategorizing every AWS charge, or moving a quarter's accounting dates by a month.
Not for: Different changes for different transactions; call update_transaction for each. Changing future transactions; a rule does that.
Returns: The job: id, status (queued, processing, success or failed), matched_count (null until the transactions are selected), updated_count, and errors (a page of failures, each with transaction_id, code, param and message). The job is all or nothing: a failed job changes no transactions, and errors say why.
When to use: "Recategorize all our Gusto transactions as Payroll", "Set the department to Engineering on every GitHub charge this year".
Workflow: Preview the selection with search_transactions using the same filters, then confirm the change and how many transactions it touches with the user before calling. To change the transactions from one account or card, find them with search_transactions and pass their transaction_ids. Pass exactly one of transaction_ids or filters, plus updates. This tool waits about 20 seconds for the job; if status is still queued or processing, call again with only job_id to check on it. A failed job with more than one page of errors has errors.has_more; pass job_id with starting_after set to errors.next_cursor for the next page. Calling again with the same transaction_ids or filters and updates within an hour of the first call returns the job that call started instead of starting another, so a retry is safe; after that, the same request runs again and picks up transactions that match now. With accounting_shift, the same request returns the first job for 30 days after it finishes, so dates never move twice; if that job comes back when the user meant to shift again, tell them.
Rules: Filters all must match, and select transactions by their values before the update. Split transactions are never selected by filters, and naming one in transaction_ids fails the job. In updates, null clears department_id or spread, or restores the original accounting date; merchant and category_id can't be null; accounting_date and accounting_shift can't be used together.
The description explains the capability, when to use it, and what to expect.
Inputs78/100
15 of 17 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
transaction_ids
txn_ IDs to change, such as from search_transactions. Use this or filters, not both.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
filters › merchant
Merchant name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
filters › category_id
A cat_ ID from list_categories.
Clear enough to supply this argument.
filters › start_date
On or after this date, as YYYY-MM-DD.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
filters › end_date
On or before this date, as YYYY-MM-DD.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
filters › status
Not provided
Missing description. Explain what this value means and how to supply it.
filters › transaction_type
Not provided
Missing description. Explain what this value means and how to supply it.
filters › categorized
false selects uncategorized transactions.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
updates › merchant
New merchant name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
updates › category_id
A cat_ ID from list_categories.
Clear enough to supply this argument.
updates › department_id
A dept_ ID from list_departments, where assignable is true, or null to remove the department.
Clear enough to supply this argument.
updates › spread
Months to spread each transaction over, or null to stop spreading.
Clear enough to supply this argument.
updates › accounting_date
Accounting date as YYYY-MM-DD, or null to restore each transaction's own date.
Clear enough to supply this argument.
updates › accounting_shift
Moves each transaction's accounting date by this many calendar months.
Clear enough to supply this argument.
job_id
A job_ ID from an earlier call, to check on it. Send it alone, or with limit and starting_after; it changes nothing.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
With job_id: errors per page, from 1 to 500. Defaults to 100.
Clear enough to supply this argument.
starting_after
With job_id: the errors.next_cursor from the previous check, unchanged.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "bulk_update_transactions",
"title": "Bulk update transactions",
"description": "Purpose: Make the same change to many transactions at once, up to 5,000, chosen by txn_ IDs or by filters: such as recategorizing every AWS charge, or moving a quarter's accounting dates by a month.\nNot for: Different changes for different transactions; call update_transaction for each. Changing future transactions; a rule does that.\nReturns: The job: id, status (queued, processing, success or failed), matched_count (null until the transactions are selected), updated_count, and errors (a page of failures, each with transaction_id, code, param and message). The job is all or nothing: a failed job changes no transactions, and errors say why.\nWhen to use: \"Recategorize all our Gusto transactions as Payroll\", \"Set the department to Engineering on every GitHub charge this year\".\nWorkflow: Preview the selection with search_transactions using the same filters, then confirm the change and how many transactions it touches with the user before calling. To change the transactions from one account or card, find them with search_transactions and pass their transaction_ids. Pass exactly one of transaction_ids or filters, plus updates. This tool waits about 20 seconds for the job; if status is still queued or processing, call again with only job_id to check on it. A failed job with more than one page of errors has errors.has_more; pass job_id with starting_after set to errors.next_cursor for the next page. Calling again with the same transaction_ids or filters and updates within an hour of the first call returns the job that call started instead of starting another, so a retry is safe; after that, the same request runs again and picks up transactions that match now. With accounting_shift, the same request returns the first job for 30 days after it finishes, so dates never move twice; if that job comes back when the user meant to shift again, tell them.\nRules: Filters all must match, and select transactions by their values before the update. Split transactions are never selected by filters, and naming one in transaction_ids fails the job. In updates, null clears department_id or spread, or restores the original accounting date; merchant and category_id can't be null; accounting_date and accounting_shift can't be used together.",
"inputSchema": {
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 500,
"minimum": 1,
"description": "With job_id: errors per page, from 1 to 500. Defaults to 100."
},
"job_id": {
"type": "string",
"description": "A job_ ID from an earlier call, to check on it. Send it alone, or with limit and starting_after; it changes nothing."
},
"filters": {
"type": "object",
"properties": {
"status": {
"enum": [
"approved",
"pending"
],
"type": "string"
},
"end_date": {
"type": "string",
"format": "date",
"description": "On or before this date, as YYYY-MM-DD."
},
"merchant": {
"type": "string",
"minLength": 1,
"description": "Merchant name."
},
"start_date": {
"type": "string",
"format": "date",
"description": "On or after this date, as YYYY-MM-DD."
},
"categorized": {
"type": "boolean",
"description": "false selects uncategorized transactions."
},
"category_id": {
"type": "string",
"description": "A cat_ ID from list_categories."
},
"transaction_type": {
"enum": [
"standard",
"transfer"
],
"type": "string"
}
},
"description": "Changes every transaction that matches all of these, up to 5,000; more fails the job. Use this or transaction_ids, not both.",
"minProperties": 1,
"additionalProperties": false
},
"updates": {
"type": "object",
"properties": {
"spread": {
"type": [
"integer",
"null"
],
"maximum": 120,
"minimum": 2,
"description": "Months to spread each transaction over, or null to stop spreading."
},
"merchant": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "New merchant name."
},
"category_id": {
"type": "string",
"description": "A cat_ ID from list_categories."
},
"department_id": {
"type": [
"string",
"null"
],
"description": "A dept_ ID from list_departments, where assignable is true, or null to remove the department."
},
"accounting_date": {
"type": [
"string",
"null"
],
"format": "date",
"description": "Accounting date as YYYY-MM-DD, or null to restore each transaction's own date."
},
"accounting_shift": {
"type": "integer",
"maximum": 36,
"minimum": -36,
"description": "Moves each transaction's accounting date by this many calendar months."
}
},
"description": "The change to make. Omitted fields stay as they are.",
"minProperties": 1,
"additionalProperties": false
},
"starting_after": {
"type": "string",
"description": "With job_id: the errors.next_cursor from the previous check, unchanged."
},
"transaction_ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 5000,
"minItems": 1,
"description": "txn_ IDs to change, such as from search_transactions. Use this or filters, not both.",
"uniqueItems": true
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: Get one transaction by its txn_ ID.
Not for: Finding transactions by merchant, date or amount; search_transactions does that. The journal entries a transaction created.
Returns: id, date, accounting_date (the date reports use), amount_cents, currency, merchant, description, category_id and category_name, categorized, department_id and department_name, transaction_type (standard, transfer or split), source (vendor, type and account_name), status (approved or pending), spread, transfer_id, created and updated. amount_cents is signed integer cents: positive for money in, negative for money out, so divide by 100 for dollars.
When to use: To check a transaction's current state, such as after updating it, or when the user gives a txn_ ID.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
id
The txn_ ID, such as one from search_transactions.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_transaction",
"title": "Get transaction",
"description": "Purpose: Get one transaction by its txn_ ID.\nNot for: Finding transactions by merchant, date or amount; search_transactions does that. The journal entries a transaction created.\nReturns: id, date, accounting_date (the date reports use), amount_cents, currency, merchant, description, category_id and category_name, categorized, department_id and department_name, transaction_type (standard, transfer or split), source (vendor, type and account_name), status (approved or pending), spread, transfer_id, created and updated. amount_cents is signed integer cents: positive for money in, negative for money out, so divide by 100 for dollars.\nWhen to use: To check a transaction's current state, such as after updating it, or when the user gives a txn_ ID.",
"inputSchema": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The txn_ ID, such as one from search_transactions."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Purpose: List the company's merchants and counterparties: the distinct names recorded in one category and every category under it, across all time.
Not for: Amounts or rankings; get_category_total gives a merchant's total, or with group_by merchant ranks merchants by amount a page at a time, so a top 10 of vendors or customers is one call and the full ranking continues while has_more is true. Never call get_category_total once per merchant. Names have no IDs.
Returns: One page of names, sorted alphabetically ignoring case, each exactly as recorded, plus has_more and next_cursor. Newly imported names can take a little while to appear.
When to use: "List my merchants", "Who are our vendors?", "Which vendors do we pay for software?", "Who pays us?", or to find the exact spelling of a merchant name before filtering by it.
Workflow: Get category_id from list_categories. For the vendors the company has expensed, use the top-level Expenses category (parent_id null); for everyone the company has income from, the top-level Income category; for a narrower list, a category under them, such as Software. A vendor paid only for purchases recorded as assets, such as capitalized equipment, appears under that asset category instead. Use names exactly as returned, case included, as the merchant in get_category_total or search_journal_entries. If has_more is true, call again with the same category_id and starting_after set to next_cursor, unchanged.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
category_id
A cat_ ID from list_categories.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Names per page, from 1 to 500. Defaults to 100.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
starting_after
The next_cursor from the previous page, unchanged. Omit it for the first page.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_merchants",
"title": "List merchants",
"description": "Purpose: List the company's merchants and counterparties: the distinct names recorded in one category and every category under it, across all time.\nNot for: Amounts or rankings; get_category_total gives a merchant's total, or with group_by merchant ranks merchants by amount a page at a time, so a top 10 of vendors or customers is one call and the full ranking continues while has_more is true. Never call get_category_total once per merchant. Names have no IDs.\nReturns: One page of names, sorted alphabetically ignoring case, each exactly as recorded, plus has_more and next_cursor. Newly imported names can take a little while to appear.\nWhen to use: \"List my merchants\", \"Who are our vendors?\", \"Which vendors do we pay for software?\", \"Who pays us?\", or to find the exact spelling of a merchant name before filtering by it.\nWorkflow: Get category_id from list_categories. For the vendors the company has expensed, use the top-level Expenses category (parent_id null); for everyone the company has income from, the top-level Income category; for a narrower list, a category under them, such as Software. A vendor paid only for purchases recorded as assets, such as capitalized equipment, appears under that asset category instead. Use names exactly as returned, case included, as the merchant in get_category_total or search_journal_entries. If has_more is true, call again with the same category_id and starting_after set to next_cursor, unchanged.",
"inputSchema": {
"type": "object",
"required": [
"category_id"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 500,
"minimum": 1,
"description": "Names per page, from 1 to 500. Defaults to 100."
},
"category_id": {
"type": "string",
"description": "A cat_ ID from list_categories."
},
"starting_after": {
"type": "string",
"description": "The next_cursor from the previous page, unchanged. Omit it for the first page."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: List the company's spreads, the amounts recognized evenly over several months instead of all at once, as the Spreads page in Finta shows them. This includes spreads on one line of a split transaction, which search_transactions can't show.
Not for: The monthly amounts a spread books, which are journal entries (search_journal_entries with source_type spread). Spreads still awaiting approval, which aren't listed. Totals of any kind, which get_category_total returns.
Returns: One page of spreads, newest date first, plus has_more and next_cursor. Each has transaction_id, split, months, date, accounting_date, amount_cents, currency, merchant, category_id and category_name, department_id and department_name. When split is true, the spread is on one line of the split transaction named by transaction_id, and the amount, category and dates are that line's. Spreads have no ID of their own. amount_cents is signed integer cents: negative for money out, so divide by 100 for dollars.
When to use: "Which transactions are spread?", "List our spreads", "Is this charge spread, and over how many months?".
Workflow: Pass a txn_ ID as transaction_id for the spreads on that transaction or on its split lines. All filters must match. If has_more is true, call again with the same filters and starting_after set to next_cursor, unchanged.
The description explains the capability, when to use it, and what to expect.
Inputs85/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
transaction_id
Only the spreads on this transaction, or on its lines if it is split: a txn_ ID from search_transactions.
Clear enough to supply this argument.
start_date
Spreads whose transaction date is on or after this day, as YYYY-MM-DD.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
end_date
Spreads whose transaction date is on or before this day, as YYYY-MM-DD.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Spreads per page, from 1 to 100. Defaults to 100.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
starting_after
The next_cursor from the previous page, unchanged. Omit it for the first page.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_spreads",
"title": "List spreads",
"description": "Purpose: List the company's spreads, the amounts recognized evenly over several months instead of all at once, as the Spreads page in Finta shows them. This includes spreads on one line of a split transaction, which search_transactions can't show.\nNot for: The monthly amounts a spread books, which are journal entries (search_journal_entries with source_type spread). Spreads still awaiting approval, which aren't listed. Totals of any kind, which get_category_total returns.\nReturns: One page of spreads, newest date first, plus has_more and next_cursor. Each has transaction_id, split, months, date, accounting_date, amount_cents, currency, merchant, category_id and category_name, department_id and department_name. When split is true, the spread is on one line of the split transaction named by transaction_id, and the amount, category and dates are that line's. Spreads have no ID of their own. amount_cents is signed integer cents: negative for money out, so divide by 100 for dollars.\nWhen to use: \"Which transactions are spread?\", \"List our spreads\", \"Is this charge spread, and over how many months?\".\nWorkflow: Pass a txn_ ID as transaction_id for the spreads on that transaction or on its split lines. All filters must match. If has_more is true, call again with the same filters and starting_after set to next_cursor, unchanged.",
"inputSchema": {
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 100,
"maximum": 100,
"minimum": 1,
"description": "Spreads per page, from 1 to 100. Defaults to 100."
},
"end_date": {
"type": "string",
"format": "date",
"description": "Spreads whose transaction date is on or before this day, as YYYY-MM-DD."
},
"start_date": {
"type": "string",
"format": "date",
"description": "Spreads whose transaction date is on or after this day, as YYYY-MM-DD."
},
"starting_after": {
"type": "string",
"description": "The next_cursor from the previous page, unchanged. Omit it for the first page."
},
"transaction_id": {
"type": "string",
"description": "Only the spreads on this transaction, or on its lines if it is split: a txn_ ID from search_transactions."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: List the lines of the company's split transactions: the parts one bank or card transaction was divided into, each with its own amount, category, department and spread.
Not for: The split transactions themselves, which search_transactions returns with transaction_type split at their full amount. Department splits and payroll bulk splits, which aren't listed. Totals of any kind, which get_category_total returns.
Returns: One page of lines, newest date first, plus has_more and next_cursor. Each has transaction_id (the split transaction it belongs to), date, accounting_date, amount_cents, currency, merchant, category_id and category_name, department_id and department_name, and spread (months, or null). Lines have no ID of their own. amount_cents is signed integer cents: negative for money out, so divide by 100 for dollars. A split's lines add up to its amount.
When to use: "What was this charge split into?", "Show me all our split transactions with their breakdown", "Which split lines are spread?".
Workflow: To break down one split, pass its txn_ ID as transaction_id. To see every split's lines, omit it and page through: that's one list, not one call per split. All filters must match. If has_more is true, call again with the same filters and starting_after set to next_cursor, unchanged.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
transaction_id
Only the lines of this split transaction: a txn_ ID from search_transactions.
Clear enough to supply this argument.
start_date
Lines whose date is on or after this day, as YYYY-MM-DD.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
end_date
Lines whose date is on or before this day, as YYYY-MM-DD.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
spread
true for lines that are spread over several months, false for lines that aren't.
Clear enough to supply this argument.
limit
Lines per page, from 1 to 100. Defaults to 100.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
starting_after
The next_cursor from the previous page, unchanged. Omit it for the first page.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_transaction_splits",
"title": "List transaction splits",
"description": "Purpose: List the lines of the company's split transactions: the parts one bank or card transaction was divided into, each with its own amount, category, department and spread.\nNot for: The split transactions themselves, which search_transactions returns with transaction_type split at their full amount. Department splits and payroll bulk splits, which aren't listed. Totals of any kind, which get_category_total returns.\nReturns: One page of lines, newest date first, plus has_more and next_cursor. Each has transaction_id (the split transaction it belongs to), date, accounting_date, amount_cents, currency, merchant, category_id and category_name, department_id and department_name, and spread (months, or null). Lines have no ID of their own. amount_cents is signed integer cents: negative for money out, so divide by 100 for dollars. A split's lines add up to its amount.\nWhen to use: \"What was this charge split into?\", \"Show me all our split transactions with their breakdown\", \"Which split lines are spread?\".\nWorkflow: To break down one split, pass its txn_ ID as transaction_id. To see every split's lines, omit it and page through: that's one list, not one call per split. All filters must match. If has_more is true, call again with the same filters and starting_after set to next_cursor, unchanged.",
"inputSchema": {
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 100,
"maximum": 100,
"minimum": 1,
"description": "Lines per page, from 1 to 100. Defaults to 100."
},
"spread": {
"type": "boolean",
"description": "true for lines that are spread over several months, false for lines that aren't."
},
"end_date": {
"type": "string",
"format": "date",
"description": "Lines whose date is on or before this day, as YYYY-MM-DD."
},
"start_date": {
"type": "string",
"format": "date",
"description": "Lines whose date is on or after this day, as YYYY-MM-DD."
},
"starting_after": {
"type": "string",
"description": "The next_cursor from the previous page, unchanged. Omit it for the first page."
},
"transaction_id": {
"type": "string",
"description": "Only the lines of this split transaction: a txn_ ID from search_transactions."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: Find the company's bank, card and reimbursement transactions in Finta by date, merchant, amount, category, source or status, with their stable txn_ IDs.
Not for: Accounting-level debits and credits, which are journal entries. Totals of any kind, including what was spent with or received from one merchant ("What did we pay Justwork last year?"): get_category_total returns the exact figure in one call, while a page of transactions isn't a total and adding up pages is slow and easy to get wrong.
Returns: One page of transactions, newest date first, plus has_more and next_cursor. Each has id, date, accounting_date (the date reports use), amount_cents, currency, merchant, description, category_id and category_name, categorized, department_id and department_name, transaction_type (standard, transfer or split), source (vendor, type and account_name), status (approved or pending), spread and transfer_id. amount_cents is signed integer cents: positive for money in, negative for money out, so divide by 100 for dollars.
When to use: "Show me our AWS charges from last month", "Show me our uncategorized transactions", "Find the $35.27 charge", or to find the txn_ ID of a transaction the user describes.
Workflow: All filters must match. If the user doesn't say whether an amount is money in or out, search both signs. Uncategorized transactions still have a category_id (Uncategorized Income or Uncategorized Expenses), so use categorized: false to find them. If has_more is true, call again with the same filters and starting_after set to next_cursor, unchanged.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
start_date
Transactions whose date (not accounting_date) is on or after this day, as YYYY-MM-DD.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
end_date
Transactions whose date (not accounting_date) is on or before this day, as YYYY-MM-DD.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
merchant
Case-insensitive text search on the merchant name.
Clear enough to supply this argument.
amount
The exact amount in dollars, signed: "-35.27" for a $35.27 charge, "4500.00" for a $4,500 deposit.
Clear enough to supply this argument.
category_id
Only transactions in this category: a cat_ ID from list_categories.
Clear enough to supply this argument.
categorized
false for uncategorized transactions only, true for categorized ones only.
Clear enough to supply this argument.
accounting_date_overridden
true for transactions whose accounting_date was moved off their date, by a user, a rule or an invoice match; false for ones where the two match or accounting_date is null.
Clear enough to supply this argument.
status
Omit it for both.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
transaction_type
transfer is a matched transfer between accounts; split is the parent of a split.
Clear enough to supply this argument.
source_vendor
The integration or vendor the transaction came from, such as "mercury" or "brex". Exact match, ignoring case.
Clear enough to supply this argument.
source_type
The type of account the transaction came from.
Clear enough to supply this argument.
limit
Transactions per page, from 1 to 100. Defaults to 100.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
starting_after
The next_cursor from the previous page, unchanged. Omit it for the first page.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "search_transactions",
"title": "Search transactions",
"description": "Purpose: Find the company's bank, card and reimbursement transactions in Finta by date, merchant, amount, category, source or status, with their stable txn_ IDs.\nNot for: Accounting-level debits and credits, which are journal entries. Totals of any kind, including what was spent with or received from one merchant (\"What did we pay Justwork last year?\"): get_category_total returns the exact figure in one call, while a page of transactions isn't a total and adding up pages is slow and easy to get wrong.\nReturns: One page of transactions, newest date first, plus has_more and next_cursor. Each has id, date, accounting_date (the date reports use), amount_cents, currency, merchant, description, category_id and category_name, categorized, department_id and department_name, transaction_type (standard, transfer or split), source (vendor, type and account_name), status (approved or pending), spread and transfer_id. amount_cents is signed integer cents: positive for money in, negative for money out, so divide by 100 for dollars.\nWhen to use: \"Show me our AWS charges from last month\", \"Show me our uncategorized transactions\", \"Find the $35.27 charge\", or to find the txn_ ID of a transaction the user describes.\nWorkflow: All filters must match. If the user doesn't say whether an amount is money in or out, search both signs. Uncategorized transactions still have a category_id (Uncategorized Income or Uncategorized Expenses), so use categorized: false to find them. If has_more is true, call again with the same filters and starting_after set to next_cursor, unchanged.",
"inputSchema": {
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 100,
"maximum": 100,
"minimum": 1,
"description": "Transactions per page, from 1 to 100. Defaults to 100."
},
"amount": {
"type": "string",
"description": "The exact amount in dollars, signed: \"-35.27\" for a $35.27 charge, \"4500.00\" for a $4,500 deposit."
},
"status": {
"enum": [
"approved",
"pending"
],
"type": "string",
"description": "Omit it for both."
},
"end_date": {
"type": "string",
"format": "date",
"description": "Transactions whose date (not accounting_date) is on or before this day, as YYYY-MM-DD."
},
"merchant": {
"type": "string",
"description": "Case-insensitive text search on the merchant name."
},
"start_date": {
"type": "string",
"format": "date",
"description": "Transactions whose date (not accounting_date) is on or after this day, as YYYY-MM-DD."
},
"categorized": {
"type": "boolean",
"description": "false for uncategorized transactions only, true for categorized ones only."
},
"category_id": {
"type": "string",
"description": "Only transactions in this category: a cat_ ID from list_categories."
},
"source_type": {
"enum": [
"bank",
"credit",
"reimbursement"
],
"type": "string",
"description": "The type of account the transaction came from."
},
"source_vendor": {
"type": "string",
"description": "The integration or vendor the transaction came from, such as \"mercury\" or \"brex\". Exact match, ignoring case."
},
"starting_after": {
"type": "string",
"description": "The next_cursor from the previous page, unchanged. Omit it for the first page."
},
"transaction_type": {
"enum": [
"standard",
"transfer",
"split"
],
"type": "string",
"description": "transfer is a matched transfer between accounts; split is the parent of a split."
},
"accounting_date_overridden": {
"type": "boolean",
"description": "true for transactions whose accounting_date was moved off their date, by a user, a rule or an invoice match; false for ones where the two match or accounting_date is null."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Purpose: Change one transaction's merchant, category, department, accounting date or spread.
Not for: Making the same change to many transactions; bulk_update_transactions does that in one call. Changing future transactions; a rule does that.
Returns: The updated transaction, with the same fields as get_transaction.
When to use: "Categorize this charge as Software", "Move this invoice to March", "Spread this annual subscription over 12 months".
Workflow: Find the transaction with search_transactions. Get category_id from list_categories and department_id from list_departments, where assignable is true. Send only the fields to change. All of them apply together, or none do if one fails. If the user will want the same change on future transactions, offer to create a rule.
The description explains the capability, when to use it, and what to expect.
Inputs96/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
id
The txn_ ID from search_transactions.
Clear enough to supply this argument.
merchant
New merchant or payee name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
category_id
A cat_ ID from list_categories.
Clear enough to supply this argument.
department_id
A dept_ ID from list_departments, or null to remove the department.
Clear enough to supply this argument.
accounting_date
The date reports use for this transaction, as YYYY-MM-DD, or null to go back to the transaction date. It can't be before the company's incorporation date.
Clear enough to supply this argument.
spread
Months to spread the transaction over, or null to stop spreading it.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "update_transaction",
"title": "Update transaction",
"description": "Purpose: Change one transaction's merchant, category, department, accounting date or spread.\nNot for: Making the same change to many transactions; bulk_update_transactions does that in one call. Changing future transactions; a rule does that.\nReturns: The updated transaction, with the same fields as get_transaction.\nWhen to use: \"Categorize this charge as Software\", \"Move this invoice to March\", \"Spread this annual subscription over 12 months\".\nWorkflow: Find the transaction with search_transactions. Get category_id from list_categories and department_id from list_departments, where assignable is true. Send only the fields to change. All of them apply together, or none do if one fails. If the user will want the same change on future transactions, offer to create a rule.",
"inputSchema": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The txn_ ID from search_transactions."
},
"spread": {
"type": [
"integer",
"null"
],
"maximum": 120,
"minimum": 2,
"description": "Months to spread the transaction over, or null to stop spreading it."
},
"merchant": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "New merchant or payee name."
},
"category_id": {
"type": "string",
"description": "A cat_ ID from list_categories."
},
"department_id": {
"type": [
"string",
"null"
],
"description": "A dept_ ID from list_departments, or null to remove the department."
},
"accounting_date": {
"type": [
"string",
"null"
],
"format": "date",
"description": "The date reports use for this transaction, as YYYY-MM-DD, or null to go back to the transaction date. It can't be before the company's incorporation date."
}
},
"minProperties": 2,
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: Add bank or credit card transactions from a file or pasted data to one Finta account.
Not for: Changing transactions already in Finta, or accounts that sync automatically unless the user confirms the sync is broken.
Returns: Validation for every row sent so far (errors, warnings, open_questions, ready_to_commit, next_step, summary in dollars), or the import result after a commit, including a url where the user can review or undo the upload.
When to use: "Add these transactions", "import this statement", "upload our Chase CSV".
Workflow: list_accounts, then create_account if no account matches, then call this tool with rows in chunks of up to 500, resolve what each result reports, and finish with commit: true once ready_to_commit is true. Nothing is visible in Finta until the commit. If the commit returns status importing, call again with only upload_id to check on it; that changes nothing.
Rules: Parse the whole file yourself and send every row, including rows you leave out, which you mark in exclude with a reason. Compute file_totals from the file itself. Pass dates exactly as the file writes them. Send amounts as plain signed decimals such as -45.00: convert accounting notation like (45.00) to -45.00 and drop currency symbols, but don't otherwise flip signs; if the file shows charges as positive, keep them and set sign_convention. Buying or selling investments doesn't change cash, so exclude those rows, but keep interest and dividends. Exclude a charge and its reversal together. Acknowledge a blocking warning only after checking the rows it lists, and mention acknowledged possible duplicates to the user. Answer open questions from the file and context, and ask the user only when you can't tell; otherwise use the suggested default. After committing, tell the user what was uploaded, what was left out and why, and give them the url.
The description explains the capability, when to use it, and what to expect.
Inputs71/100
11 of 14 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
account_id
The acct_ ID from list_accounts or create_account. Required on the first call.
Clear enough to supply this argument.
upload_id
The id returned by the first call. Pass it on every later call for the same file.
Clear enough to supply this argument.
file_totals › row_count
Transaction rows in the file, including ones you exclude.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
file_totals › net_amount
Sum of every row amount with the file's own signs, in dollars, such as "-38214.55".
Clear enough to supply this argument.
columns
The order of values in each row, such as ["row", "date", "description", "amount"]. Required with the first rows.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
rows
Up to 500 rows per call. row is the 1-based row number; sending a row number again replaces that row. Dates exactly as the file writes them, such as "03/04/2026", so Finta can work out month/day order. Descriptions of at most 40 characters; shorten longer ones to the merchant or payee. Amounts as plain signed decimals, such as "-45.00" for a file that writes "(45.00)".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
date_format
Answers a date_format_ambiguous open question. Infer it from the bank and the file if you can.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
sign_convention
How the file signs money out. Card exports often show charges as positive. Defaults to negative_is_money_out.
Clear enough to supply this argument.
exclude › items › row
Not provided
Missing description. Explain what this value means and how to supply it.
exclude › items › reason
Not provided
Missing description. Explain what this value means and how to supply it.
exclude › items › note
Not provided
Missing description. Explain what this value means and how to supply it.
acknowledged_warnings
Blocking warning codes you checked and accept for the rows they list now.
Clear enough to supply this argument.
allow_synced_account
Upload to an account that syncs from an integration. Uploads to these usually create duplicates; confirm with the user first.
Clear enough to supply this argument.
commit
Import the upload if nothing blocks it. Otherwise the result lists what still blocks it.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "upload_transactions",
"title": "Upload transactions",
"description": "Purpose: Add bank or credit card transactions from a file or pasted data to one Finta account.\nNot for: Changing transactions already in Finta, or accounts that sync automatically unless the user confirms the sync is broken.\nReturns: Validation for every row sent so far (errors, warnings, open_questions, ready_to_commit, next_step, summary in dollars), or the import result after a commit, including a url where the user can review or undo the upload.\nWhen to use: \"Add these transactions\", \"import this statement\", \"upload our Chase CSV\".\nWorkflow: list_accounts, then create_account if no account matches, then call this tool with rows in chunks of up to 500, resolve what each result reports, and finish with commit: true once ready_to_commit is true. Nothing is visible in Finta until the commit. If the commit returns status importing, call again with only upload_id to check on it; that changes nothing.\nRules: Parse the whole file yourself and send every row, including rows you leave out, which you mark in exclude with a reason. Compute file_totals from the file itself. Pass dates exactly as the file writes them. Send amounts as plain signed decimals such as -45.00: convert accounting notation like (45.00) to -45.00 and drop currency symbols, but don't otherwise flip signs; if the file shows charges as positive, keep them and set sign_convention. Buying or selling investments doesn't change cash, so exclude those rows, but keep interest and dividends. Exclude a charge and its reversal together. Acknowledge a blocking warning only after checking the rows it lists, and mention acknowledged possible duplicates to the user. Answer open questions from the file and context, and ask the user only when you can't tell; otherwise use the suggested default. After committing, tell the user what was uploaded, what was left out and why, and give them the url.",
"inputSchema": {
"type": "object",
"properties": {
"rows": {
"type": "array",
"items": {
"type": "array",
"items": {
"type": [
"string",
"number",
"null"
]
}
},
"maxItems": 500,
"description": "Up to 500 rows per call. row is the 1-based row number; sending a row number again replaces that row. Dates exactly as the file writes them, such as \"03/04/2026\", so Finta can work out month/day order. Descriptions of at most 40 characters; shorten longer ones to the merchant or payee. Amounts as plain signed decimals, such as \"-45.00\" for a file that writes \"(45.00)\"."
},
"commit": {
"type": "boolean",
"description": "Import the upload if nothing blocks it. Otherwise the result lists what still blocks it."
},
"columns": {
"type": "array",
"items": {
"enum": [
"row",
"date",
"description",
"amount"
],
"type": "string"
},
"description": "The order of values in each row, such as [\"row\", \"date\", \"description\", \"amount\"]. Required with the first rows."
},
"exclude": {
"type": "array",
"items": {
"type": "object",
"required": [
"row",
"reason"
],
"properties": {
"row": {
"type": "integer",
"minimum": 1
},
"note": {
"type": "string",
"maxLength": 500
},
"reason": {
"enum": [
"investment_trade",
"reversal_pair",
"duplicate",
"not_a_transaction",
"other"
],
"type": "string"
}
},
"additionalProperties": false
},
"description": "Rows to leave out, each with a reason. Adds to earlier exclusions."
},
"upload_id": {
"type": "string",
"description": "The id returned by the first call. Pass it on every later call for the same file."
},
"account_id": {
"type": "string",
"description": "The acct_ ID from list_accounts or create_account. Required on the first call."
},
"date_format": {
"enum": [
"MDY",
"DMY"
],
"type": "string",
"description": "Answers a date_format_ambiguous open question. Infer it from the bank and the file if you can."
},
"file_totals": {
"type": "object",
"required": [
"row_count",
"net_amount"
],
"properties": {
"row_count": {
"type": "integer",
"maximum": 2000,
"minimum": 1,
"description": "Transaction rows in the file, including ones you exclude."
},
"net_amount": {
"type": "string",
"description": "Sum of every row amount with the file's own signs, in dollars, such as \"-38214.55\"."
}
},
"description": "Computed from the whole file. Required on the first call and cannot change.",
"additionalProperties": false
},
"sign_convention": {
"enum": [
"negative_is_money_out",
"positive_is_money_out"
],
"type": "string",
"description": "How the file signs money out. Card exports often show charges as positive. Defaults to negative_is_money_out."
},
"allow_synced_account": {
"type": "boolean",
"description": "Upload to an account that syncs from an integration. Uploads to these usually create duplicates; confirm with the user first."
},
"acknowledged_warnings": {
"type": "array",
"items": {
"enum": [
"possible_duplicate",
"overlaps_existing_data",
"possible_investment_trade",
"possible_reversal_pair"
],
"type": "string"
},
"description": "Blocking warning codes you checked and accept for the rows they list now."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: Get the company's balance sheet as of one date: cash, assets, liabilities and equity.
Not for: Activity over a period, such as revenue or spending (get_income_statement) or cash movement (get_cash_flow). One section on its own; the full statement always comes back.
Returns: date is the exact inclusive cutoff used, with currency, refreshed_at, cash_cents, assets and liabilities (each with total_cents and categories), equity (total_cents, categories and retained_earnings), and liabilities_and_equity_cents, which equals assets.total_cents. Each category has category_id, name, balance_cents, position and parent_category_id. Amounts are integer cents, so divide by 100 for dollars.
When to use: "How much cash do we have?", "What were our total liabilities at the end of June?", "Show me the balance sheet".
Dates and source: Calendar dates use America/Los_Angeles (Pacific Time); balances include all activity through the exact date. Whole months use whole-month rollups. A cutoff of today uses fresh current-month month-to-date (MTD) rollups for month-start through today. Other non-month-end cutoffs use slower raw-entry reads for just the cutoff month. Stale or unfilled MTD safely falls back to raw entries; reported balances are unchanged.
Freshness: refreshed_at covers the entire report through its exact cutoff. For rollup-only reads it is the maximum contributing rollup timestamp, including MTD. Any live raw portion is current as of the call, even when no raw entries match. It is null only when no contributing timestamp or live raw read is available.
Workflow: Omit date for today in Pacific Time. A parent category's amount already includes its children, so to total a section, add only the categories whose parent_category_id is null, or use the section's total_cents.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
date
Exact inclusive as-of calendar date, as YYYY-MM-DD in Pacific Time. Defaults to today. Month-end uses whole-month rollups; today uses fresh MTD; other partial-month cutoffs use slower raw entries.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_balance_sheet",
"title": "Get balance sheet",
"description": "Purpose: Get the company's balance sheet as of one date: cash, assets, liabilities and equity.\nNot for: Activity over a period, such as revenue or spending (get_income_statement) or cash movement (get_cash_flow). One section on its own; the full statement always comes back.\nReturns: date is the exact inclusive cutoff used, with currency, refreshed_at, cash_cents, assets and liabilities (each with total_cents and categories), equity (total_cents, categories and retained_earnings), and liabilities_and_equity_cents, which equals assets.total_cents. Each category has category_id, name, balance_cents, position and parent_category_id. Amounts are integer cents, so divide by 100 for dollars.\nWhen to use: \"How much cash do we have?\", \"What were our total liabilities at the end of June?\", \"Show me the balance sheet\".\nDates and source: Calendar dates use America/Los_Angeles (Pacific Time); balances include all activity through the exact date. Whole months use whole-month rollups. A cutoff of today uses fresh current-month month-to-date (MTD) rollups for month-start through today. Other non-month-end cutoffs use slower raw-entry reads for just the cutoff month. Stale or unfilled MTD safely falls back to raw entries; reported balances are unchanged.\nFreshness: refreshed_at covers the entire report through its exact cutoff. For rollup-only reads it is the maximum contributing rollup timestamp, including MTD. Any live raw portion is current as of the call, even when no raw entries match. It is null only when no contributing timestamp or live raw read is available.\nWorkflow: Omit date for today in Pacific Time. A parent category's amount already includes its children, so to total a section, add only the categories whose parent_category_id is null, or use the section's total_cents.",
"inputSchema": {
"type": "object",
"properties": {
"date": {
"type": "string",
"format": "date",
"description": "Exact inclusive as-of calendar date, as YYYY-MM-DD in Pacific Time. Defaults to today. Month-end uses whole-month rollups; today uses fresh MTD; other partial-month cutoffs use slower raw entries."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: Get the company's cash flow statement for one date range: cash from operating, investing and financing activities, and cash at the start and end.
Not for: Profit and loss (get_income_statement) or balances on a date (get_balance_sheet). One section on its own; the full statement always comes back.
Returns: start_date and end_date are the exact inclusive dates used, with currency, refreshed_at, operating_activities, investing_activities and financing_activities (each with total_cents and categories), beginning_cash_cents, ending_cash_cents and change_in_cash_cents. Each category has category_id, name, amount_cents, position and parent_category_id. Amounts are signed integer cents, so divide by 100 for dollars.
When to use: "How much cash did we burn last quarter?", "Where did our cash go this year?", "What was our operating cash flow in August?"
Dates and source: Calendar dates use America/Los_Angeles (Pacific Time), and both boundaries are honored exactly, inclusive. Whole months use whole-month rollups. Current-month start through today uses fresh month-to-date (MTD) rollups, keeping month-aligned month-to-date and year-to-date requests fast. Other partial months, including a midmonth start, use slower raw-entry reads for just those months. Stale or unfilled MTD safely falls back to raw entries; the report's numerical semantics are unchanged.
Freshness: refreshed_at covers the entire report, including partial months and opening and closing balances. For rollup-only reads it is the maximum contributing rollup timestamp, including MTD. Any live raw portion is current as of the call, even when no raw entries match. It is null only when no contributing timestamp or live raw read is available.
Workflow: Omit both dates for the current quarter to date in Pacific Time. One call covers one period; for a month-by-month view, call once per month. Operating activities include the groups "Changes in Working Capital" and "Non-Cash Expenses", whose IDs start with grp_ rather than cat_. A parent's amount already includes its children, so to total a section, add only the entries whose parent_category_id is null, or use the section's total_cents.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
start_date
Exact first included calendar date, as YYYY-MM-DD in Pacific Time. Defaults to the start of the current quarter. A midmonth start uses slower raw entries for that partial month.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
end_date
Exact last included calendar date, as YYYY-MM-DD in Pacific Time. Defaults to today. Month-start through today uses fresh MTD rollups; other partial-month cutoffs use slower raw entries.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_cash_flow",
"title": "Get cash flow statement",
"description": "Purpose: Get the company's cash flow statement for one date range: cash from operating, investing and financing activities, and cash at the start and end.\nNot for: Profit and loss (get_income_statement) or balances on a date (get_balance_sheet). One section on its own; the full statement always comes back.\nReturns: start_date and end_date are the exact inclusive dates used, with currency, refreshed_at, operating_activities, investing_activities and financing_activities (each with total_cents and categories), beginning_cash_cents, ending_cash_cents and change_in_cash_cents. Each category has category_id, name, amount_cents, position and parent_category_id. Amounts are signed integer cents, so divide by 100 for dollars.\nWhen to use: \"How much cash did we burn last quarter?\", \"Where did our cash go this year?\", \"What was our operating cash flow in August?\"\nDates and source: Calendar dates use America/Los_Angeles (Pacific Time), and both boundaries are honored exactly, inclusive. Whole months use whole-month rollups. Current-month start through today uses fresh month-to-date (MTD) rollups, keeping month-aligned month-to-date and year-to-date requests fast. Other partial months, including a midmonth start, use slower raw-entry reads for just those months. Stale or unfilled MTD safely falls back to raw entries; the report's numerical semantics are unchanged.\nFreshness: refreshed_at covers the entire report, including partial months and opening and closing balances. For rollup-only reads it is the maximum contributing rollup timestamp, including MTD. Any live raw portion is current as of the call, even when no raw entries match. It is null only when no contributing timestamp or live raw read is available.\nWorkflow: Omit both dates for the current quarter to date in Pacific Time. One call covers one period; for a month-by-month view, call once per month. Operating activities include the groups \"Changes in Working Capital\" and \"Non-Cash Expenses\", whose IDs start with grp_ rather than cat_. A parent's amount already includes its children, so to total a section, add only the entries whose parent_category_id is null, or use the section's total_cents.",
"inputSchema": {
"type": "object",
"properties": {
"end_date": {
"type": "string",
"format": "date",
"description": "Exact last included calendar date, as YYYY-MM-DD in Pacific Time. Defaults to today. Month-start through today uses fresh MTD rollups; other partial-month cutoffs use slower raw entries."
},
"start_date": {
"type": "string",
"format": "date",
"description": "Exact first included calendar date, as YYYY-MM-DD in Pacific Time. Defaults to the start of the current quarter. A midmonth start uses slower raw entries for that partial month."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: Get an exact total in one call: for a category and everything under it, or for one merchant, over an inclusive date range or as of an exact date. Or split that total in one call by merchant, ranked, or by month.
Not for: The whole income statement or balance sheet; the report tools return those. Listing individual transactions or entries; never add those up yourself for a total or a ranking.
Returns: Without group_by: total_cents, debit_cents, credit_cents, currency, point_in_time, the exact dates used and refreshed_at. With group_by: data, a list of rows, each with merchant (null for activity recorded without one) or month, and total_cents, debit_cents and credit_cents, plus the dates used, refreshed_at, has_more and next_cursor. Amounts are signed integer cents, so divide by 100 for dollars: assets are debits minus credits, and every other category is credits minus debits, so expenses come out negative. For a balance sheet category, each month row is cumulative through that month's closing date, with the last calendar month's cutoff at end_date, so never add month rows up for it.
When to use: "How much did we spend on software this year?", "What's our total for OpenAI, all time?", "Which vendors do we spend the most on?", "Who are our top 10 customers?", "What did we pay AWS each month?", "Which month did we spend the most?", "What was our accounts receivable balance at the end of June?"
Dates: All dates are calendar dates in America/Los_Angeles (Pacific Time). Periodic totals include exactly start_date through end_date, inclusive; point-in-time totals include all activity through the exact date. This replaces the old behavior that ignored the day. For group_by month, periodic first and last rows are clipped to the exact range; point-in-time start_date selects the first displayed month without excluding earlier cumulative activity, and the last calendar month's cutoff is end_date. Whole months use whole-month rollups. Current-month start through today uses fresh month-to-date (MTD) rollups, so month-aligned month-to-date and year-to-date requests stay fast. Other partial months, including a midmonth start, use slower raw-entry reads for just those months. Stale or unfilled MTD safely falls back to raw entries.
Freshness: refreshed_at covers the whole total or returned page, including partial months, not only full months. For rollup-only reads it is the maximum contributing rollup timestamp, including MTD. Any live raw portion is current as of the call, even when no raw entries match. It is null only when no contributing timestamp or live raw read is available.
Workflow: Get category_id and point_in_time from list_categories. When point_in_time is false (income statement categories), pass start_date and end_date; when it's true (balance sheet categories), pass date only, except with group_by month, which always takes start_date and end_date. For vendors use the top-level Expenses category (parent_id null), and for customers the top-level Income category. group_by merchant ranks merchants: order desc, the default, puts the biggest first in the category's own direction (most spent under Expenses, most received under Income), and asc the smallest first; limit takes that many rows from the top, so limit 10 is a top 10. group_by month gives one row per month, up to 120 months, oldest first unless you set order. If has_more is true and you need more rows, call again with the same arguments and starting_after set to next_cursor, unchanged. Merchant names are exact as recorded, so one vendor can appear under several spellings: combine obvious variants and say you did. For one merchant's total, pass merchant, matching the name exactly, including case, from list_merchants or a group_by merchant row. If you don't know the exact spelling, find it with one search_transactions call using merchant and a small limit, then pass the name exactly as it appears there; the total still comes from this tool. Expenses and Income cover every category under them, but not purchases recorded as assets, such as capitalized equipment or the part of a prepaid plan not yet expensed, so a vendor's total can be less than what was paid; say so when it matters. For all time, start at the company's incorporation date from get_company and end today in Pacific Time. Use as few calls as the question needs: a total is one call without group_by, so add group_by only when the question asks for a ranking or a month-by-month breakdown.
The description explains the capability, when to use it, and what to expect.
Inputs86/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
category_id
A cat_ ID from list_categories.
Clear enough to supply this argument.
start_date
Calendar date as YYYY-MM-DD in Pacific Time. Exact inclusive start when point_in_time is false; selects the first displayed month for point-in-time group_by month without excluding earlier balances. A midmonth periodic start is slower.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
end_date
Exact inclusive final calendar date as YYYY-MM-DD in Pacific Time, when point_in_time is false or with group_by month. The last calendar month stops at this date, including for point-in-time groups.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
date
Exact inclusive as-of calendar date as YYYY-MM-DD in Pacific Time, when point_in_time is true. Not with group_by month.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
merchant
Only this merchant: the exact name, case included, such as one from list_merchants.
Clear enough to supply this argument.
group_by
Split the total: merchant for ranked rows, or month for up to 120 monthly rows. Periodic boundary months are clipped to the exact dates; point-in-time rows are cumulative closing balances, ending at end_date.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
order
With group_by: desc for the biggest first in the category's own direction (the default for merchant), asc for the smallest first. Months without it are oldest first.
Clear enough to supply this argument.
limit
With group_by: how many rows to return from the top of the order. Merchant defaults to 100; month returns every month.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
starting_after
With group_by: the next_cursor from the previous call, unchanged, with the same other arguments.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_category_total",
"title": "Get category total",
"description": "Purpose: Get an exact total in one call: for a category and everything under it, or for one merchant, over an inclusive date range or as of an exact date. Or split that total in one call by merchant, ranked, or by month.\nNot for: The whole income statement or balance sheet; the report tools return those. Listing individual transactions or entries; never add those up yourself for a total or a ranking.\nReturns: Without group_by: total_cents, debit_cents, credit_cents, currency, point_in_time, the exact dates used and refreshed_at. With group_by: data, a list of rows, each with merchant (null for activity recorded without one) or month, and total_cents, debit_cents and credit_cents, plus the dates used, refreshed_at, has_more and next_cursor. Amounts are signed integer cents, so divide by 100 for dollars: assets are debits minus credits, and every other category is credits minus debits, so expenses come out negative. For a balance sheet category, each month row is cumulative through that month's closing date, with the last calendar month's cutoff at end_date, so never add month rows up for it.\nWhen to use: \"How much did we spend on software this year?\", \"What's our total for OpenAI, all time?\", \"Which vendors do we spend the most on?\", \"Who are our top 10 customers?\", \"What did we pay AWS each month?\", \"Which month did we spend the most?\", \"What was our accounts receivable balance at the end of June?\"\nDates: All dates are calendar dates in America/Los_Angeles (Pacific Time). Periodic totals include exactly start_date through end_date, inclusive; point-in-time totals include all activity through the exact date. This replaces the old behavior that ignored the day. For group_by month, periodic first and last rows are clipped to the exact range; point-in-time start_date selects the first displayed month without excluding earlier cumulative activity, and the last calendar month's cutoff is end_date. Whole months use whole-month rollups. Current-month start through today uses fresh month-to-date (MTD) rollups, so month-aligned month-to-date and year-to-date requests stay fast. Other partial months, including a midmonth start, use slower raw-entry reads for just those months. Stale or unfilled MTD safely falls back to raw entries.\nFreshness: refreshed_at covers the whole total or returned page, including partial months, not only full months. For rollup-only reads it is the maximum contributing rollup timestamp, including MTD. Any live raw portion is current as of the call, even when no raw entries match. It is null only when no contributing timestamp or live raw read is available.\nWorkflow: Get category_id and point_in_time from list_categories. When point_in_time is false (income statement categories), pass start_date and end_date; when it's true (balance sheet categories), pass date only, except with group_by month, which always takes start_date and end_date. For vendors use the top-level Expenses category (parent_id null), and for customers the top-level Income category. group_by merchant ranks merchants: order desc, the default, puts the biggest first in the category's own direction (most spent under Expenses, most received under Income), and asc the smallest first; limit takes that many rows from the top, so limit 10 is a top 10. group_by month gives one row per month, up to 120 months, oldest first unless you set order. If has_more is true and you need more rows, call again with the same arguments and starting_after set to next_cursor, unchanged. Merchant names are exact as recorded, so one vendor can appear under several spellings: combine obvious variants and say you did. For one merchant's total, pass merchant, matching the name exactly, including case, from list_merchants or a group_by merchant row. If you don't know the exact spelling, find it with one search_transactions call using merchant and a small limit, then pass the name exactly as it appears there; the total still comes from this tool. Expenses and Income cover every category under them, but not purchases recorded as assets, such as capitalized equipment or the part of a prepaid plan not yet expensed, so a vendor's total can be less than what was paid; say so when it matters. For all time, start at the company's incorporation date from get_company and end today in Pacific Time. Use as few calls as the question needs: a total is one call without group_by, so add group_by only when the question asks for a ranking or a month-by-month breakdown.",
"inputSchema": {
"type": "object",
"required": [
"category_id"
],
"properties": {
"date": {
"type": "string",
"format": "date",
"description": "Exact inclusive as-of calendar date as YYYY-MM-DD in Pacific Time, when point_in_time is true. Not with group_by month."
},
"limit": {
"type": "integer",
"maximum": 500,
"minimum": 1,
"description": "With group_by: how many rows to return from the top of the order. Merchant defaults to 100; month returns every month."
},
"order": {
"enum": [
"asc",
"desc"
],
"type": "string",
"description": "With group_by: desc for the biggest first in the category's own direction (the default for merchant), asc for the smallest first. Months without it are oldest first."
},
"end_date": {
"type": "string",
"format": "date",
"description": "Exact inclusive final calendar date as YYYY-MM-DD in Pacific Time, when point_in_time is false or with group_by month. The last calendar month stops at this date, including for point-in-time groups."
},
"group_by": {
"enum": [
"merchant",
"month"
],
"type": "string",
"description": "Split the total: merchant for ranked rows, or month for up to 120 monthly rows. Periodic boundary months are clipped to the exact dates; point-in-time rows are cumulative closing balances, ending at end_date."
},
"merchant": {
"type": "string",
"description": "Only this merchant: the exact name, case included, such as one from list_merchants."
},
"start_date": {
"type": "string",
"format": "date",
"description": "Calendar date as YYYY-MM-DD in Pacific Time. Exact inclusive start when point_in_time is false; selects the first displayed month for point-in-time group_by month without excluding earlier balances. A midmonth periodic start is slower."
},
"category_id": {
"type": "string",
"description": "A cat_ ID from list_categories."
},
"starting_after": {
"type": "string",
"description": "With group_by: the next_cursor from the previous call, unchanged, with the same other arguments."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Purpose: Get the company's income statement (profit and loss) for one date range: revenue, expenses, operating income, non-operating income, taxes and net income. Use group_by=department for the GAAP P&L; group_by=category is the default.
Not for: Balances on a date (get_balance_sheet) or cash movement (get_cash_flow). One category on its own; the full statement always comes back.
Returns: start_date and end_date are the exact inclusive dates used, with currency, refreshed_at, operating_income_cents and net_income_cents, plus one top-level field per section: revenue, expenses and non_operating_income always, and uncategorized_income and taxes only when the company has those rows. With category grouping, uncategorized_expenses is also present when the company has that row. The response echoes group_by. With category grouping, each section has total_cents and categories. Each category has category_id, name, amount_cents, position and parent_category_id. Amounts are signed integer cents: income is positive and expenses are negative, so divide by 100 for dollars.
Department grouping: Expenses have total_cents and rows instead of categories. Each row has row_id, parent_row_id, kind (department, category, or group), nullable department_id and category_id, name, amount_cents and position. Parent amounts include their children. No Department is an assignment group, not uncategorized expenses. Revenue, non-operating income, optional uncategorized income and taxes keep their category format. Department grouping has no top-level uncategorized_expenses field, requires the departments feature and returns refreshed_at=null.
When to use: "What was our net income last quarter?", "How much revenue did we make in September?", "What are our biggest expenses this year?"
Dates and source: Calendar dates use America/Los_Angeles (Pacific Time), and both boundaries are honored exactly, inclusive. With category grouping, whole months use whole-month rollups. Current-month start through today uses fresh month-to-date (MTD) rollups, keeping month-aligned month-to-date and year-to-date requests fast. Other partial months, including a midmonth start, use slower raw-entry reads for just those months. Stale or unfilled MTD safely falls back to raw entries; the report's numerical semantics are unchanged.
Category freshness: refreshed_at covers the entire report, including partial months. For rollup-only reads it is the maximum contributing rollup timestamp, including MTD. Any live raw portion is current as of the call, even when no raw entries match. It is null only when no contributing timestamp or live raw read is available.
Workflow: Omit both dates for the current quarter to date in Pacific Time. One call covers one period; for a month-by-month view, call once per month. A parent category's amount already includes its children, so to total a section, add only the categories whose parent_category_id is null, or use the section's total_cents.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
start_date
Exact first included calendar date, as YYYY-MM-DD in Pacific Time. Defaults to the start of the current quarter. For category grouping, a midmonth start uses slower raw entries for that partial month.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
group_by
Expense grouping. Defaults to category; department returns the GAAP P&L.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
end_date
Exact last included calendar date, as YYYY-MM-DD in Pacific Time. Defaults to today. For category grouping, month-start through today uses fresh MTD rollups; other partial-month cutoffs use slower raw entries.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_income_statement",
"title": "Get income statement",
"description": "Purpose: Get the company's income statement (profit and loss) for one date range: revenue, expenses, operating income, non-operating income, taxes and net income. Use group_by=department for the GAAP P&L; group_by=category is the default.\nNot for: Balances on a date (get_balance_sheet) or cash movement (get_cash_flow). One category on its own; the full statement always comes back.\nReturns: start_date and end_date are the exact inclusive dates used, with currency, refreshed_at, operating_income_cents and net_income_cents, plus one top-level field per section: revenue, expenses and non_operating_income always, and uncategorized_income and taxes only when the company has those rows. With category grouping, uncategorized_expenses is also present when the company has that row. The response echoes group_by. With category grouping, each section has total_cents and categories. Each category has category_id, name, amount_cents, position and parent_category_id. Amounts are signed integer cents: income is positive and expenses are negative, so divide by 100 for dollars.\nDepartment grouping: Expenses have total_cents and rows instead of categories. Each row has row_id, parent_row_id, kind (department, category, or group), nullable department_id and category_id, name, amount_cents and position. Parent amounts include their children. No Department is an assignment group, not uncategorized expenses. Revenue, non-operating income, optional uncategorized income and taxes keep their category format. Department grouping has no top-level uncategorized_expenses field, requires the departments feature and returns refreshed_at=null.\nWhen to use: \"What was our net income last quarter?\", \"How much revenue did we make in September?\", \"What are our biggest expenses this year?\"\nDates and source: Calendar dates use America/Los_Angeles (Pacific Time), and both boundaries are honored exactly, inclusive. With category grouping, whole months use whole-month rollups. Current-month start through today uses fresh month-to-date (MTD) rollups, keeping month-aligned month-to-date and year-to-date requests fast. Other partial months, including a midmonth start, use slower raw-entry reads for just those months. Stale or unfilled MTD safely falls back to raw entries; the report's numerical semantics are unchanged.\nCategory freshness: refreshed_at covers the entire report, including partial months. For rollup-only reads it is the maximum contributing rollup timestamp, including MTD. Any live raw portion is current as of the call, even when no raw entries match. It is null only when no contributing timestamp or live raw read is available.\nWorkflow: Omit both dates for the current quarter to date in Pacific Time. One call covers one period; for a month-by-month view, call once per month. A parent category's amount already includes its children, so to total a section, add only the categories whose parent_category_id is null, or use the section's total_cents.",
"inputSchema": {
"type": "object",
"properties": {
"end_date": {
"type": "string",
"format": "date",
"description": "Exact last included calendar date, as YYYY-MM-DD in Pacific Time. Defaults to today. For category grouping, month-start through today uses fresh MTD rollups; other partial-month cutoffs use slower raw entries."
},
"group_by": {
"enum": [
"category",
"department"
],
"type": "string",
"description": "Expense grouping. Defaults to category; department returns the GAAP P&L."
},
"start_date": {
"type": "string",
"format": "date",
"description": "Exact first included calendar date, as YYYY-MM-DD in Pacific Time. Defaults to the start of the current quarter. For category grouping, a midmonth start uses slower raw entries for that partial month."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: Find the company's journal entries, the debits and credits behind its reports, by date, category, merchant, department, transaction or source, with their stable je_ IDs.
Not for: Bank and card activity as it came in, which search_transactions returns. Totals of any kind, including one merchant's total: get_category_total returns the exact figure in one call, while adding up entries page by page is slow and easy to get wrong.
Returns: One page of entries, newest date first, plus has_more and next_cursor. Each has id, date, merchant, amount_cents, type (debit or credit), currency, category_id and category_name, department_id, transaction_id and source_type. amount_cents is always positive integer cents, so use type for the direction and divide by 100 for dollars.
When to use: "Which entries make up our Software expense in September?", "What did this transaction post to the ledger?", "Show me the spread entries for our annual insurance".
Workflow: Filters all must match. Get category_id from list_categories and department_id from list_departments. transaction_id returns every entry the transaction created, including its split lines' and its spread and capitalization entries. source_type split covers only department splits and payroll bulk splits: a transaction split into lines with their own categories posts transaction entries. merchant must match the name exactly, including case. If has_more is true, call again with the same filters and starting_after set to next_cursor, unchanged.
The description explains the capability, when to use it, and what to expect.
Inputs80/100
9 of 10 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
start_date
Entries on or after this date, as YYYY-MM-DD.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
end_date
Entries on or before this date, as YYYY-MM-DD.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
category_id
A cat_ ID from list_categories.
Clear enough to supply this argument.
merchant
The exact merchant or counterparty name, case included.
Clear enough to supply this argument.
department_id
A dept_ ID from list_departments.
Clear enough to supply this argument.
transaction_id
A txn_ ID: the entries that transaction created.
Clear enough to supply this argument.
source_type
What created the entry.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
type
Not provided
Missing description. Explain what this value means and how to supply it.
limit
Entries per page, from 1 to 100. Defaults to 100.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
starting_after
The next_cursor from the previous page, unchanged. Omit it for the first page.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "search_journal_entries",
"title": "Search journal entries",
"description": "Purpose: Find the company's journal entries, the debits and credits behind its reports, by date, category, merchant, department, transaction or source, with their stable je_ IDs.\nNot for: Bank and card activity as it came in, which search_transactions returns. Totals of any kind, including one merchant's total: get_category_total returns the exact figure in one call, while adding up entries page by page is slow and easy to get wrong.\nReturns: One page of entries, newest date first, plus has_more and next_cursor. Each has id, date, merchant, amount_cents, type (debit or credit), currency, category_id and category_name, department_id, transaction_id and source_type. amount_cents is always positive integer cents, so use type for the direction and divide by 100 for dollars.\nWhen to use: \"Which entries make up our Software expense in September?\", \"What did this transaction post to the ledger?\", \"Show me the spread entries for our annual insurance\".\nWorkflow: Filters all must match. Get category_id from list_categories and department_id from list_departments. transaction_id returns every entry the transaction created, including its split lines' and its spread and capitalization entries. source_type split covers only department splits and payroll bulk splits: a transaction split into lines with their own categories posts transaction entries. merchant must match the name exactly, including case. If has_more is true, call again with the same filters and starting_after set to next_cursor, unchanged.",
"inputSchema": {
"type": "object",
"properties": {
"type": {
"enum": [
"debit",
"credit"
],
"type": "string"
},
"limit": {
"type": "integer",
"default": 100,
"maximum": 100,
"minimum": 1,
"description": "Entries per page, from 1 to 100. Defaults to 100."
},
"end_date": {
"type": "string",
"format": "date",
"description": "Entries on or before this date, as YYYY-MM-DD."
},
"merchant": {
"type": "string",
"description": "The exact merchant or counterparty name, case included."
},
"start_date": {
"type": "string",
"format": "date",
"description": "Entries on or after this date, as YYYY-MM-DD."
},
"category_id": {
"type": "string",
"description": "A cat_ ID from list_categories."
},
"source_type": {
"enum": [
"transaction",
"spread",
"invoice",
"csv_upload",
"manual_batch",
"capitalization",
"split",
"intercompany"
],
"type": "string",
"description": "What created the entry."
},
"department_id": {
"type": "string",
"description": "A dept_ ID from list_departments."
},
"starting_after": {
"type": "string",
"description": "The next_cursor from the previous page, unchanged. Omit it for the first page."
},
"transaction_id": {
"type": "string",
"description": "A txn_ ID: the entries that transaction created."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: Create an automation rule, so transactions that match its conditions get a merchant, category, department, spread or accounting-date offset automatically.
Not for: A one-off change to transactions; update those directly. Creating categories or departments.
Returns: The saved rule: id, conditions and actions.
When to use: "Always categorize AWS as Hosting", "From now on, put Gusto under Payroll" (future only, so apply_to_existing_transactions: false).
Workflow: Get IDs from list_categories, list_departments, list_accounts and list_cards, and check list_rules for a rule that already does this. Confirm the conditions and actions with the user, and ask whether the rule should also change transactions already in Finta; apply_to_existing_transactions is required, so pass their answer, or false when they asked only about the future. With true, the rule also runs in the background on matching transactions already in Finta: approved ones that are uncategorized, never pending ones; and only if the rule sets a department, also any matching transaction without a department, pending ones included. It never replaces a department already set, or the category or merchant of an approved transaction that's already categorized. A pending transaction it selects does take the rule's category and merchant, replacing any it has, so when the rule sets a department along with either, say so before the user decides. It needs Transactions: Manage. A saved rule doesn't mean that run has finished. If the API answers rule_already_exists, its message names the existing rule; use that rule rather than creating another.
Rules: merchant matches the merchant name Finta assigned, and description matches the bank's description, both ignoring case. transaction_type can only be "transfer".
The description explains the capability, when to use it, and what to expect.
Inputs69/100
7 of 9 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
conditions › items › field
Not provided
Missing description. Explain what this value means and how to supply it.
conditions › items › operator
Not provided
Missing description. Explain what this value means and how to supply it.
conditions › items › value
merchant and description: text, with equals or contains. account_id: an acct_ ID from list_accounts, with equals. card_id: a card_ ID from list_cards, with equals. transaction_type: "transfer", with equals. amount_cents: signed integer cents, negative for money out, with equals, greater_than (at least), less_than (at most), or between with [minimum, maximum], both included.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
actions › merchant
Merchant name to assign.
Clear enough to supply this argument.
actions › category_id
A cat_ ID from list_categories.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
actions › department_id
A dept_ ID from list_departments, where assignable is true.
Clear enough to supply this argument.
actions › spread
Months to spread each matching transaction over.
Clear enough to supply this argument.
actions › accounting_date_offset_months
Moves the accounting date this many months from the transaction date when a transaction is imported. Never applied to existing transactions, and a nonzero offset can't be combined with an Asset category.
Clear enough to supply this argument.
apply_to_existing_transactions
Required. true also runs the rule on matching transactions already in Finta; false affects only future transactions. Ask the user unless they already said.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "create_rule",
"title": "Create rule",
"description": "Purpose: Create an automation rule, so transactions that match its conditions get a merchant, category, department, spread or accounting-date offset automatically.\nNot for: A one-off change to transactions; update those directly. Creating categories or departments.\nReturns: The saved rule: id, conditions and actions.\nWhen to use: \"Always categorize AWS as Hosting\", \"From now on, put Gusto under Payroll\" (future only, so apply_to_existing_transactions: false).\nWorkflow: Get IDs from list_categories, list_departments, list_accounts and list_cards, and check list_rules for a rule that already does this. Confirm the conditions and actions with the user, and ask whether the rule should also change transactions already in Finta; apply_to_existing_transactions is required, so pass their answer, or false when they asked only about the future. With true, the rule also runs in the background on matching transactions already in Finta: approved ones that are uncategorized, never pending ones; and only if the rule sets a department, also any matching transaction without a department, pending ones included. It never replaces a department already set, or the category or merchant of an approved transaction that's already categorized. A pending transaction it selects does take the rule's category and merchant, replacing any it has, so when the rule sets a department along with either, say so before the user decides. It needs Transactions: Manage. A saved rule doesn't mean that run has finished. If the API answers rule_already_exists, its message names the existing rule; use that rule rather than creating another.\nRules: merchant matches the merchant name Finta assigned, and description matches the bank's description, both ignoring case. transaction_type can only be \"transfer\".",
"inputSchema": {
"type": "object",
"required": [
"conditions",
"actions",
"apply_to_existing_transactions"
],
"properties": {
"actions": {
"type": "object",
"properties": {
"spread": {
"type": "integer",
"maximum": 36,
"minimum": 2,
"description": "Months to spread each matching transaction over."
},
"merchant": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "Merchant name to assign."
},
"category_id": {
"type": "string",
"description": "A cat_ ID from list_categories."
},
"department_id": {
"type": "string",
"description": "A dept_ ID from list_departments, where assignable is true."
},
"accounting_date_offset_months": {
"type": "integer",
"maximum": 24,
"minimum": -24,
"description": "Moves the accounting date this many months from the transaction date when a transaction is imported. Never applied to existing transactions, and a nonzero offset can't be combined with an Asset category."
}
},
"description": "What the rule sets. Include only the actions it should set.",
"minProperties": 1,
"additionalProperties": false
},
"conditions": {
"type": "array",
"items": {
"type": "object",
"required": [
"field",
"operator",
"value"
],
"properties": {
"field": {
"enum": [
"merchant",
"description",
"account_id",
"card_id",
"transaction_type",
"amount_cents"
],
"type": "string"
},
"value": {
"type": [
"string",
"integer",
"array"
],
"items": {
"type": "integer"
},
"description": "merchant and description: text, with equals or contains. account_id: an acct_ ID from list_accounts, with equals. card_id: a card_ ID from list_cards, with equals. transaction_type: \"transfer\", with equals. amount_cents: signed integer cents, negative for money out, with equals, greater_than (at least), less_than (at most), or between with [minimum, maximum], both included."
},
"operator": {
"enum": [
"equals",
"contains",
"greater_than",
"less_than",
"between"
],
"type": "string"
}
},
"additionalProperties": false
},
"minItems": 1,
"description": "Every condition must match. Repeat a field to combine constraints, such as two amount_cents conditions."
},
"apply_to_existing_transactions": {
"type": "boolean",
"description": "Required. true also runs the rule on matching transactions already in Finta; false affects only future transactions. Ask the user unless they already said."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: Delete an automation rule so it stops applying to new transactions.
Not for: Undoing everything the rule did. Transactions the rule categorized can have their categories reset to the default, while matched transfers keep theirs; other changes the rule made stay.
Returns: deleted: true and the rule's id. A rule that was already deleted, or that doesn't exist, returns the same.
When to use: "Delete the AWS rule", "That rule keeps miscategorizing things, remove it".
Workflow: Find the rule with list_rules, show the user its conditions and actions, and get their confirmation before deleting. Deleting needs both Accounting setup: Manage and Transactions: Manage. If the API answers rule_busy, the rule is running on existing transactions; wait a little and try again.
The description explains the capability, when to use it, and what to expect.
Inputs93/100
Input documentation gives an agent enough context to populate the arguments.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "delete_rule",
"title": "Delete rule",
"description": "Purpose: Delete an automation rule so it stops applying to new transactions.\nNot for: Undoing everything the rule did. Transactions the rule categorized can have their categories reset to the default, while matched transfers keep theirs; other changes the rule made stay.\nReturns: deleted: true and the rule's id. A rule that was already deleted, or that doesn't exist, returns the same.\nWhen to use: \"Delete the AWS rule\", \"That rule keeps miscategorizing things, remove it\".\nWorkflow: Find the rule with list_rules, show the user its conditions and actions, and get their confirmation before deleting. Deleting needs both Accounting setup: Manage and Transactions: Manage. If the API answers rule_busy, the rule is running on existing transactions; wait a little and try again.",
"inputSchema": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The rule_ ID from list_rules."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: List the company's automation rules, which match incoming transactions by their conditions and set a merchant, category, department, spread or accounting date, with their stable rule_ IDs.
Not for: Running rules or changing transactions; reading rules changes nothing. Rules Finta manages itself, and rules that belong to a category or department, aren't listed.
Returns: One page of rules, newest first, each with id, conditions and actions, plus has_more and next_cursor. A transaction must match every condition. Only the actions a rule sets are present. amount_cents conditions are signed integer cents, negative for money out, so -5000 is a $50.00 charge.
When to use: "What rules do we have?", "Is there a rule for AWS?", or to find a rule's rule_ ID before update_rule or delete_rule.
Workflow: There is no search, so page through and read the conditions. If has_more is true, call again with starting_after set to next_cursor, unchanged. Conditions on account or card_name text are older rules; new rules can't use them. category_id and department_id are the IDs list_categories and list_departments return.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Rules per page, from 1 to 500. Defaults to 100.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
starting_after
The next_cursor from the previous page, unchanged. Omit it for the first page.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_rules",
"title": "List rules",
"description": "Purpose: List the company's automation rules, which match incoming transactions by their conditions and set a merchant, category, department, spread or accounting date, with their stable rule_ IDs.\nNot for: Running rules or changing transactions; reading rules changes nothing. Rules Finta manages itself, and rules that belong to a category or department, aren't listed.\nReturns: One page of rules, newest first, each with id, conditions and actions, plus has_more and next_cursor. A transaction must match every condition. Only the actions a rule sets are present. amount_cents conditions are signed integer cents, negative for money out, so -5000 is a $50.00 charge.\nWhen to use: \"What rules do we have?\", \"Is there a rule for AWS?\", or to find a rule's rule_ ID before update_rule or delete_rule.\nWorkflow: There is no search, so page through and read the conditions. If has_more is true, call again with starting_after set to next_cursor, unchanged. Conditions on account or card_name text are older rules; new rules can't use them. category_id and department_id are the IDs list_categories and list_departments return.",
"inputSchema": {
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 500,
"minimum": 1,
"description": "Rules per page, from 1 to 500. Defaults to 100."
},
"starting_after": {
"type": "string",
"description": "The next_cursor from the previous page, unchanged. Omit it for the first page."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Purpose: Change an automation rule's conditions or actions.
Not for: Fixing transactions the rule already touched. An update affects only transactions matched from now on; it never re-runs the rule on existing transactions.
Returns: The complete saved rule: id, conditions and actions.
When to use: "Make the AWS rule only match charges over $100", "Change the Gusto rule to put it under Benefits".
Workflow: Find the rule and its current definition with list_rules, and confirm the change with the user. conditions replaces the whole list, so send every condition the rule should keep; omit conditions to leave them as they are. actions changes only the keys you send: set a key to null to remove that action, and omit keys to keep them. The rule must still have at least one condition and one action. If the API answers rule_busy, the rule is running on existing transactions; wait a little and try again.
The description explains the capability, when to use it, and what to expect.
Inputs67/100
7 of 9 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
id
The rule_ ID from list_rules.
Clear enough to supply this argument.
conditions › items › field
Not provided
Missing description. Explain what this value means and how to supply it.
conditions › items › operator
Not provided
Missing description. Explain what this value means and how to supply it.
conditions › items › value
merchant and description: text, with equals or contains. account_id: an acct_ ID from list_accounts, with equals. card_id: a card_ ID from list_cards, with equals. transaction_type: "transfer", with equals. amount_cents: signed integer cents, negative for money out, with equals, greater_than (at least), less_than (at most), or between with [minimum, maximum], both included.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
actions › merchant
Merchant name to assign.
Clear enough to supply this argument.
actions › category_id
A cat_ ID from list_categories.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
actions › department_id
A dept_ ID from list_departments, where assignable is true.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
actions › spread
Months to spread each matching transaction over.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
actions › accounting_date_offset_months
Moves the accounting date this many months from the transaction date when a transaction is imported. Never applied to existing transactions, and a nonzero offset can't be combined with an Asset category.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "update_rule",
"title": "Update rule",
"description": "Purpose: Change an automation rule's conditions or actions.\nNot for: Fixing transactions the rule already touched. An update affects only transactions matched from now on; it never re-runs the rule on existing transactions.\nReturns: The complete saved rule: id, conditions and actions.\nWhen to use: \"Make the AWS rule only match charges over $100\", \"Change the Gusto rule to put it under Benefits\".\nWorkflow: Find the rule and its current definition with list_rules, and confirm the change with the user. conditions replaces the whole list, so send every condition the rule should keep; omit conditions to leave them as they are. actions changes only the keys you send: set a key to null to remove that action, and omit keys to keep them. The rule must still have at least one condition and one action. If the API answers rule_busy, the rule is running on existing transactions; wait a little and try again.",
"inputSchema": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The rule_ ID from list_rules."
},
"actions": {
"type": "object",
"properties": {
"spread": {
"type": [
"integer",
"null"
],
"maximum": 36,
"minimum": 2,
"description": "Months to spread each matching transaction over."
},
"merchant": {
"type": [
"string",
"null"
],
"maxLength": 40,
"minLength": 1,
"description": "Merchant name to assign."
},
"category_id": {
"type": [
"string",
"null"
],
"description": "A cat_ ID from list_categories."
},
"department_id": {
"type": [
"string",
"null"
],
"description": "A dept_ ID from list_departments, where assignable is true."
},
"accounting_date_offset_months": {
"type": [
"integer",
"null"
],
"maximum": 24,
"minimum": -24,
"description": "Moves the accounting date this many months from the transaction date when a transaction is imported. Never applied to existing transactions, and a nonzero offset can't be combined with an Asset category."
}
},
"description": "Only the actions to change. null removes an action from the rule.",
"minProperties": 1,
"additionalProperties": false
},
"conditions": {
"type": "array",
"items": {
"type": "object",
"required": [
"field",
"operator",
"value"
],
"properties": {
"field": {
"enum": [
"merchant",
"description",
"account_id",
"card_id",
"transaction_type",
"amount_cents"
],
"type": "string"
},
"value": {
"type": [
"string",
"integer",
"array"
],
"items": {
"type": "integer"
},
"description": "merchant and description: text, with equals or contains. account_id: an acct_ ID from list_accounts, with equals. card_id: a card_ ID from list_cards, with equals. transaction_type: \"transfer\", with equals. amount_cents: signed integer cents, negative for money out, with equals, greater_than (at least), less_than (at most), or between with [minimum, maximum], both included."
},
"operator": {
"enum": [
"equals",
"contains",
"greater_than",
"less_than",
"between"
],
"type": "string"
}
},
"additionalProperties": false
},
"minItems": 1,
"description": "Replaces every condition. Omit it to keep the current ones."
}
},
"minProperties": 2,
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: Start connecting a bank or card provider to Finta, or reconnecting one whose status is requires_reconnect, by getting the link the user opens to approve access.
Not for: Integrations whose api_connectable is false in list_integrations; the user connects those in the Finta web app under Settings -> Integrations. Checking whether a connection finished; use get_integration_connection.
Returns: A connect_request with status pending and url, the provider's single-use authorization page, valid until expires_at (Unix seconds). intent is reconnect when it re-authenticates an existing connection.
When to use: "Connect our Mercury account", "Hook up Brex", "Our Ramp connection needs reconnecting".
Workflow: Check list_integrations first for the key and api_connectable. If you can open links in the user's own browser and they allow it, open url; otherwise show it to them. It only works in a browser where they are signed in to Finta as themselves. Never fill in or click through the provider's page: the approval has to come from the user. Ask them to tell you once they've approved, then call get_integration_connection. Calling this again returns the same open link; after a request fails or expires, it starts a new one.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
key
The integration key from list_integrations, such as mercury, brex or ramp.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "connect_integration",
"title": "Connect integration",
"description": "Purpose: Start connecting a bank or card provider to Finta, or reconnecting one whose status is requires_reconnect, by getting the link the user opens to approve access.\nNot for: Integrations whose api_connectable is false in list_integrations; the user connects those in the Finta web app under Settings -> Integrations. Checking whether a connection finished; use get_integration_connection.\nReturns: A connect_request with status pending and url, the provider's single-use authorization page, valid until expires_at (Unix seconds). intent is reconnect when it re-authenticates an existing connection.\nWhen to use: \"Connect our Mercury account\", \"Hook up Brex\", \"Our Ramp connection needs reconnecting\".\nWorkflow: Check list_integrations first for the key and api_connectable. If you can open links in the user's own browser and they allow it, open url; otherwise show it to them. It only works in a browser where they are signed in to Finta as themselves. Never fill in or click through the provider's page: the approval has to come from the user. Ask them to tell you once they've approved, then call get_integration_connection. Calling this again returns the same open link; after a request fails or expires, it starts a new one.",
"inputSchema": {
"type": "object",
"required": [
"key"
],
"properties": {
"key": {
"type": "string",
"description": "The integration key from list_integrations, such as mercury, brex or ramp."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: Check how a connection started with connect_integration is going.
Not for: Starting a connection; use connect_integration. The status of integrations in general; list_integrations returns that.
Returns: The latest connect_request you started for this integration. status is pending until the user approves at the provider, authorizing while Finta finishes the connection, then complete or failed, or expired when nobody finished the link before expires_at. failure_code says why a failed request failed: access_denied (the user declined), provider_admin_required (the approving account isn't a provider admin), provider_error or connection_failed.
When to use: After the user says they've approved access at the provider. "Did the Mercury connection go through?"
Workflow: Call it once the user says they've approved, not in a loop while they're still at the provider. If it's pending, the user hasn't finished approving; ask them to finish before checking again. If it's authorizing, Finta needs a few more seconds; check once more. If it failed, tell the user why; if they want to retry, call connect_integration for a new link. A request that failed or expired stays here until a new one starts.
The description explains the capability, when to use it, and what to expect.
Inputs97/100
Input documentation gives an agent enough context to populate the arguments.
key
The integration key passed to connect_integration, such as mercury.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_integration_connection",
"title": "Get integration connection",
"description": "Purpose: Check how a connection started with connect_integration is going.\nNot for: Starting a connection; use connect_integration. The status of integrations in general; list_integrations returns that.\nReturns: The latest connect_request you started for this integration. status is pending until the user approves at the provider, authorizing while Finta finishes the connection, then complete or failed, or expired when nobody finished the link before expires_at. failure_code says why a failed request failed: access_denied (the user declined), provider_admin_required (the approving account isn't a provider admin), provider_error or connection_failed.\nWhen to use: After the user says they've approved access at the provider. \"Did the Mercury connection go through?\"\nWorkflow: Call it once the user says they've approved, not in a loop while they're still at the provider. If it's pending, the user hasn't finished approving; ask them to finish before checking again. If it's authorizing, Finta needs a few more seconds; check once more. If it failed, tell the user why; if they want to retry, call connect_integration for a new link. A request that failed or expired stays here until a new one starts.",
"inputSchema": {
"type": "object",
"required": [
"key"
],
"properties": {
"key": {
"type": "string",
"description": "The integration key passed to connect_integration, such as mercury."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: List the integrations Finta offers this company, such as banks, cards, payroll, revenue and cap table providers, and whether each one is connected.
Not for: The accounts or cards an integration brings in; list_accounts and list_cards return those. Connecting or reconnecting an integration; connect_integration does that.
Returns: Every integration in one response. Each has key (such as mercury, ramp or carta), name, type (banking, cap_table, payroll, revenue, notifications or legal) and status: connected, not_connected, connecting, or requires_reconnect when a connection that used to work needs the user to sign in to the provider again. api_connectable says whether connect_integration can start a connection; when it's false, the user connects it in the Finta web app.
When to use: "Is our Brex connected?", "Which banks feed Finta?", "Why did our Mercury transactions stop coming in?"
Workflow: Most integrations are not_connected, so filter by status when the user asks what's connected. When an integration is requires_reconnect, its data stops updating until it's reconnected: offer to reconnect it with connect_integration when api_connectable is true, otherwise tell the user to reconnect it in Finta.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_integrations",
"title": "List integrations",
"description": "Purpose: List the integrations Finta offers this company, such as banks, cards, payroll, revenue and cap table providers, and whether each one is connected.\nNot for: The accounts or cards an integration brings in; list_accounts and list_cards return those. Connecting or reconnecting an integration; connect_integration does that.\nReturns: Every integration in one response. Each has key (such as mercury, ramp or carta), name, type (banking, cap_table, payroll, revenue, notifications or legal) and status: connected, not_connected, connecting, or requires_reconnect when a connection that used to work needs the user to sign in to the provider again. api_connectable says whether connect_integration can start a connection; when it's false, the user connects it in the Finta web app.\nWhen to use: \"Is our Brex connected?\", \"Which banks feed Finta?\", \"Why did our Mercury transactions stop coming in?\"\nWorkflow: Most integrations are not_connected, so filter by status when the user asks what's connected. When an integration is requires_reconnect, its data stops updating until it's reconnected: offer to reconnect it with connect_integration when api_connectable is true, otherwise tell the user to reconnect it in Finta.",
"inputSchema": {
"type": "object",
"properties": {},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
Shorten the title to an action and subject; move usage details into the description.
Description98/100
Not available to this company yet (early access: invoices). Contact Finta to request access.
Purpose: Record an invoice the company already sent a customer, which books its revenue: Accounts Receivable for the total, and revenue for each line item.
Not for: Sending an invoice; Finta doesn't send anything to customers. Recording a payment; once the money arrives, use match_invoice_payment.
Returns: The recorded invoice, status open, with its inv_ ID. Amounts in it are integer cents, so divide by 100 for dollars.
When to use: "Record this invoice" (from a PDF or another billing system), "We invoiced Globex $12,000 for an annual contract today".
Workflow: Get revenue category IDs from list_categories, or omit category_id for the company's default revenue category. Use the invoice's own date, customer name and amounts. spread_months recognizes a line's revenue monthly instead of on the invoice date, such as 12 for an annual contract billed up front; ask the user when the invoice doesn't say. If the API answers invoice_already_exists, the invoice is already recorded under the ID in the message: tell the user rather than creating it again. A date in a tax year the company finished with Finta is refused (closed_books).
Rules: Amounts are in dollars, such as "12000.00". A line item's amount is negative for a refund, which can't be spread. Discounts and customer balance credits reduce the total and tax adds to it; give each as a positive amount, at most one of each kind. The total must be more than 0.
The description explains the capability, when to use it, and what to expect.
Inputs56/100
6 of 9 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
customer_name
The customer the invoice was sent to, as it appears on the invoice.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
invoice_date
The date the invoice was issued, as YYYY-MM-DD.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
line_items › items › description
Not provided
Missing description. Explain what this value means and how to supply it.
line_items › items › amount
Dollars, such as "12000.00". Negative for a refund.
Clear enough to supply this argument.
line_items › items › category_id
A revenue cat_ ID from list_categories. Omit it for the default revenue category.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
line_items › items › spread_months
0 (the default) recognizes the revenue on the invoice date; 2 to 120 spreads it monthly. 1 is not allowed.
Clear enough to supply this argument.
adjustments › items › kind
Not provided
Missing description. Explain what this value means and how to supply it.
adjustments › items › amount
Dollars, always positive, such as "500.00".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
adjustments › items › description
Not provided
Missing description. Explain what this value means and how to supply it.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "create_invoice",
"title": "Create invoice (not available yet)",
"description": "Not available to this company yet (early access: invoices). Contact Finta to request access.\nPurpose: Record an invoice the company already sent a customer, which books its revenue: Accounts Receivable for the total, and revenue for each line item.\nNot for: Sending an invoice; Finta doesn't send anything to customers. Recording a payment; once the money arrives, use match_invoice_payment.\nReturns: The recorded invoice, status open, with its inv_ ID. Amounts in it are integer cents, so divide by 100 for dollars.\nWhen to use: \"Record this invoice\" (from a PDF or another billing system), \"We invoiced Globex $12,000 for an annual contract today\".\nWorkflow: Get revenue category IDs from list_categories, or omit category_id for the company's default revenue category. Use the invoice's own date, customer name and amounts. spread_months recognizes a line's revenue monthly instead of on the invoice date, such as 12 for an annual contract billed up front; ask the user when the invoice doesn't say. If the API answers invoice_already_exists, the invoice is already recorded under the ID in the message: tell the user rather than creating it again. A date in a tax year the company finished with Finta is refused (closed_books).\nRules: Amounts are in dollars, such as \"12000.00\". A line item's amount is negative for a refund, which can't be spread. Discounts and customer balance credits reduce the total and tax adds to it; give each as a positive amount, at most one of each kind. The total must be more than 0.",
"inputSchema": {
"type": "object",
"required": [
"customer_name",
"invoice_date",
"line_items"
],
"properties": {
"line_items": {
"type": "array",
"items": {
"type": "object",
"required": [
"amount"
],
"properties": {
"amount": {
"type": "string",
"description": "Dollars, such as \"12000.00\". Negative for a refund."
},
"category_id": {
"type": "string",
"description": "A revenue cat_ ID from list_categories. Omit it for the default revenue category."
},
"description": {
"type": "string"
},
"spread_months": {
"type": "integer",
"maximum": 120,
"minimum": 0,
"description": "0 (the default) recognizes the revenue on the invoice date; 2 to 120 spreads it monthly. 1 is not allowed."
}
},
"additionalProperties": false
},
"maxItems": 10,
"minItems": 1
},
"adjustments": {
"type": "array",
"items": {
"type": "object",
"required": [
"kind",
"amount"
],
"properties": {
"kind": {
"enum": [
"discount",
"customer_balance_credit",
"tax"
],
"type": "string"
},
"amount": {
"type": "string",
"description": "Dollars, always positive, such as \"500.00\"."
},
"description": {
"type": "string"
}
},
"additionalProperties": false
}
},
"invoice_date": {
"type": "string",
"format": "date",
"description": "The date the invoice was issued, as YYYY-MM-DD."
},
"customer_name": {
"type": "string",
"minLength": 1,
"description": "The customer the invoice was sent to, as it appears on the invoice."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
Shorten the title to an action and subject; move usage details into the description.
Description99/100
Not available to this company yet (early access: invoices). Contact Finta to request access.
Purpose: Get one invoice by its inv_ ID, with the bank deposit that paid it.
Not for: Finding invoices by customer, status or amount; list_invoices does that.
Returns: invoice, the same object list_invoices returns, and paid_transaction: for a paid invoice, the matched deposit as get_transaction returns it (null while the invoice is open or voided, or when the deposit can't be read, such as one deleted after it was matched). Amounts are integer cents, so divide by 100 for dollars.
When to use: "Did Acme pay invoice inv_…?", "When was this invoice paid?", or to check an invoice after create_invoice, void_invoice or match_invoice_payment.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_invoice",
"title": "Get invoice (not available yet)",
"description": "Not available to this company yet (early access: invoices). Contact Finta to request access.\nPurpose: Get one invoice by its inv_ ID, with the bank deposit that paid it.\nNot for: Finding invoices by customer, status or amount; list_invoices does that.\nReturns: invoice, the same object list_invoices returns, and paid_transaction: for a paid invoice, the matched deposit as get_transaction returns it (null while the invoice is open or voided, or when the deposit can't be read, such as one deleted after it was matched). Amounts are integer cents, so divide by 100 for dollars.\nWhen to use: \"Did Acme pay invoice inv_…?\", \"When was this invoice paid?\", or to check an invoice after create_invoice, void_invoice or match_invoice_payment.",
"inputSchema": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The inv_ ID, such as one from list_invoices."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
Shorten the title to an action and subject; move usage details into the description.
Description99/100
Not available to this company yet (early access: invoices). Contact Finta to request access.
Purpose: Find the company's invoices: ones it sent its customers and recorded in Finta so their revenue is booked, with their inv_ IDs.
Not for: Sending invoices or reminders; Finta doesn't send anything to customers.
Returns: One page of invoices, newest invoice date first, plus has_more and next_cursor. Each has id, status (open, paid or voided), customer_name, invoice_date, amount_cents (the total due), currency, line_items, adjustments, paid_transaction_id and paid_date (set once a bank deposit is matched as its payment), source (manual or stripe) and stripe_url. Amounts are integer cents, so divide by 100 for dollars.
When to use: "What invoices are still open?", "What does Acme owe us?", "Which invoice did this deposit pay?" (pass paid_transaction_id), "Which open invoice is this $4,500 deposit for?" (status open and amount "4500.00"), or to check an invoice isn't already recorded before create_invoice.
Workflow: Filters combine; all must match. If has_more is true, call again with the same filters and starting_after set to next_cursor, unchanged.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
status
open is unpaid. Omit it for every status.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
customer
Case-insensitive text search on the customer name.
Clear enough to supply this argument.
amount
The exact invoice total in dollars, such as "4500.00".
Clear enough to supply this argument.
start_date
Invoices dated on or after this date, as YYYY-MM-DD.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
end_date
Invoices dated on or before this date, as YYYY-MM-DD.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
paid_transaction_id
A txn_ ID: only the invoice that deposit paid.
Clear enough to supply this argument.
limit
Invoices per page, from 1 to 100. Defaults to 100.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
starting_after
The next_cursor from the previous page, unchanged. Omit it for the first page.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_invoices",
"title": "List invoices (not available yet)",
"description": "Not available to this company yet (early access: invoices). Contact Finta to request access.\nPurpose: Find the company's invoices: ones it sent its customers and recorded in Finta so their revenue is booked, with their inv_ IDs.\nNot for: Sending invoices or reminders; Finta doesn't send anything to customers.\nReturns: One page of invoices, newest invoice date first, plus has_more and next_cursor. Each has id, status (open, paid or voided), customer_name, invoice_date, amount_cents (the total due), currency, line_items, adjustments, paid_transaction_id and paid_date (set once a bank deposit is matched as its payment), source (manual or stripe) and stripe_url. Amounts are integer cents, so divide by 100 for dollars.\nWhen to use: \"What invoices are still open?\", \"What does Acme owe us?\", \"Which invoice did this deposit pay?\" (pass paid_transaction_id), \"Which open invoice is this $4,500 deposit for?\" (status open and amount \"4500.00\"), or to check an invoice isn't already recorded before create_invoice.\nWorkflow: Filters combine; all must match. If has_more is true, call again with the same filters and starting_after set to next_cursor, unchanged.",
"inputSchema": {
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 100,
"maximum": 100,
"minimum": 1,
"description": "Invoices per page, from 1 to 100. Defaults to 100."
},
"amount": {
"type": "string",
"description": "The exact invoice total in dollars, such as \"4500.00\"."
},
"status": {
"enum": [
"open",
"paid",
"voided"
],
"type": "string",
"description": "open is unpaid. Omit it for every status."
},
"customer": {
"type": "string",
"description": "Case-insensitive text search on the customer name."
},
"end_date": {
"type": "string",
"format": "date",
"description": "Invoices dated on or before this date, as YYYY-MM-DD."
},
"start_date": {
"type": "string",
"format": "date",
"description": "Invoices dated on or after this date, as YYYY-MM-DD."
},
"starting_after": {
"type": "string",
"description": "The next_cursor from the previous page, unchanged. Omit it for the first page."
},
"paid_transaction_id": {
"type": "string",
"description": "A txn_ ID: only the invoice that deposit paid."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
Shorten the title to an action and subject; move usage details into the description.
Description100/100
Not available to this company yet (early access: invoices). Contact Finta to request access.
Purpose: Record a bank deposit as the payment for an open invoice, which marks the invoice paid. With unmatch: true, undo that.
Not for: Recording a payment that isn't in Finta's bank transactions; wait until the deposit syncs. Partial payments: the deposit must be for the invoice's exact total.
Returns: The invoice, status paid with paid_transaction_id and paid_date; or, after unmatching, status open.
When to use: "Acme paid their invoice", "This $4,500 deposit is the Globex invoice", "That payment was matched to the wrong invoice" (unmatch, then match the right one).
Workflow: To find the deposit for an invoice, call search_transactions with the invoice's total as a positive amount in dollars, source_type bank and transaction_type standard; add a start_date around the invoice date if there are several. To find the invoice for a deposit, call list_invoices with status open and the deposit's amount. Matching changes the deposit: it takes the invoice's revenue category, its accounting date becomes the invoice date, and unmatching later returns it to Uncategorized Income rather than its previous category. So if the deposit is already categorized, tell the user what will change and get their confirmation first. Split deposits are refused; the user can match those in the Finta app. Matching and unmatching need Transactions: Manage as well as Invoices: Manage.
The description explains the capability, when to use it, and what to expect.
Inputs96/100
Input documentation gives an agent enough context to populate the arguments.
invoice_id
The inv_ ID from list_invoices.
Clear enough to supply this argument.
transaction_id
The deposit's txn_ ID from search_transactions. To unmatch, the paid_transaction_id the invoice shows.
Clear enough to supply this argument.
unmatch
true to undo the match instead. Defaults to false.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "match_invoice_payment",
"title": "Match invoice payment (not available yet)",
"description": "Not available to this company yet (early access: invoices). Contact Finta to request access.\nPurpose: Record a bank deposit as the payment for an open invoice, which marks the invoice paid. With unmatch: true, undo that.\nNot for: Recording a payment that isn't in Finta's bank transactions; wait until the deposit syncs. Partial payments: the deposit must be for the invoice's exact total.\nReturns: The invoice, status paid with paid_transaction_id and paid_date; or, after unmatching, status open.\nWhen to use: \"Acme paid their invoice\", \"This $4,500 deposit is the Globex invoice\", \"That payment was matched to the wrong invoice\" (unmatch, then match the right one).\nWorkflow: To find the deposit for an invoice, call search_transactions with the invoice's total as a positive amount in dollars, source_type bank and transaction_type standard; add a start_date around the invoice date if there are several. To find the invoice for a deposit, call list_invoices with status open and the deposit's amount. Matching changes the deposit: it takes the invoice's revenue category, its accounting date becomes the invoice date, and unmatching later returns it to Uncategorized Income rather than its previous category. So if the deposit is already categorized, tell the user what will change and get their confirmation first. Split deposits are refused; the user can match those in the Finta app. Matching and unmatching need Transactions: Manage as well as Invoices: Manage.",
"inputSchema": {
"type": "object",
"required": [
"invoice_id",
"transaction_id"
],
"properties": {
"unmatch": {
"type": "boolean",
"description": "true to undo the match instead. Defaults to false."
},
"invoice_id": {
"type": "string",
"description": "The inv_ ID from list_invoices."
},
"transaction_id": {
"type": "string",
"description": "The deposit's txn_ ID from search_transactions. To unmatch, the paid_transaction_id the invoice shows."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
Shorten the title to an action and subject; move usage details into the description.
Description99/100
Not available to this company yet (early access: invoices). Contact Finta to request access.
Purpose: Void an open invoice, removing the revenue and Accounts Receivable it booked. It can't be undone.
Not for: A paid invoice; the API refuses it (invoice_not_open), so unmatch its payment with match_invoice_payment first. Correcting an invoice; void it and record the correct one with create_invoice.
Returns: The invoice, status voided.
When to use: "That invoice was canceled", "Void the duplicate Acme invoice".
Workflow: Find the invoice with list_invoices, show the user which one it is, and get their confirmation before voiding.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Input documentation gives an agent enough context to populate the arguments.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "void_invoice",
"title": "Void invoice (not available yet)",
"description": "Not available to this company yet (early access: invoices). Contact Finta to request access.\nPurpose: Void an open invoice, removing the revenue and Accounts Receivable it booked. It can't be undone.\nNot for: A paid invoice; the API refuses it (invoice_not_open), so unmatch its payment with match_invoice_payment first. Correcting an invoice; void it and record the correct one with create_invoice.\nReturns: The invoice, status voided.\nWhen to use: \"That invoice was canceled\", \"Void the duplicate Acme invoice\".\nWorkflow: Find the invoice with list_invoices, show the user which one it is, and get their confirmation before voiding.",
"inputSchema": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The inv_ ID from list_invoices."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: Get a one-time URL to upload a PDF of a tax return or Delaware franchise tax report the company already filed, and the file_id it becomes.
Not for: Anything but PDFs, or sending the PDF itself; this tool only prepares the upload.
Returns: file_id, url, method (PUT), headers to send with the PUT, and expires_at; the url works for 10 minutes.
When to use: Before upload_income_tax_return or upload_delaware_franchise_tax_report, when the user has the filed PDF on this computer.
Workflow: Get an upload URL with this tool, PUT the PDF, then call the upload tool with the file ID. Compute size with `wc -c < FILE` and checksum with `openssl md5 -binary FILE | base64`. PUT from a terminal with every returned header, such as curl --fail -X PUT --upload-file FILE -H "Content-Type: application/pdf" -H "Content-MD5: <checksum>" -H "Content-Disposition: <Content-Disposition from headers>" "<url>". For a company with no records for that year, upload the return first, then the Delaware report.
Rules: One URL per PDF. The file must be attached within 24 hours and attaches once; a PUT can't change it, since storage only accepts bytes matching size and checksum.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
filename
The PDF's file name, such as "2025 Form 1120.pdf". The Taxes page shows it.
Clear enough to supply this argument.
size
The file's length in bytes, from `wc -c < FILE`.
Clear enough to supply this argument.
checksum
The file's MD5 digest in base64, from `openssl md5 -binary FILE | base64`.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "create_file_upload",
"title": "Create file upload",
"description": "Purpose: Get a one-time URL to upload a PDF of a tax return or Delaware franchise tax report the company already filed, and the file_id it becomes.\nNot for: Anything but PDFs, or sending the PDF itself; this tool only prepares the upload.\nReturns: file_id, url, method (PUT), headers to send with the PUT, and expires_at; the url works for 10 minutes.\nWhen to use: Before upload_income_tax_return or upload_delaware_franchise_tax_report, when the user has the filed PDF on this computer.\nWorkflow: Get an upload URL with this tool, PUT the PDF, then call the upload tool with the file ID. Compute size with `wc -c < FILE` and checksum with `openssl md5 -binary FILE | base64`. PUT from a terminal with every returned header, such as curl --fail -X PUT --upload-file FILE -H \"Content-Type: application/pdf\" -H \"Content-MD5: <checksum>\" -H \"Content-Disposition: <Content-Disposition from headers>\" \"<url>\". For a company with no records for that year, upload the return first, then the Delaware report.\nRules: One URL per PDF. The file must be attached within 24 hours and attaches once; a PUT can't change it, since storage only accepts bytes matching size and checksum.",
"inputSchema": {
"type": "object",
"required": [
"filename",
"size",
"checksum"
],
"properties": {
"size": {
"type": "integer",
"minimum": 1,
"description": "The file's length in bytes, from `wc -c < FILE`."
},
"checksum": {
"type": "string",
"pattern": "^[A-Za-z0-9+/]{22}==$",
"description": "The file's MD5 digest in base64, from `openssl md5 -binary FILE | base64`."
},
"filename": {
"type": "string",
"minLength": 1,
"description": "The PDF's file name, such as \"2025 Form 1120.pdf\". The Taxes page shows it."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: Search the company's tracked vendor 1099 filing records, or retrieve one by its f1099_ ID, including available W-9 and 1099 documents.
Not for: Generating or filing forms, sending W-9 requests, changing records, determining legal obligations, or income/franchise returns (use search_taxes).
Returns: data, has_more, next_cursor and summaries. Filter searches include annual filing status and counts for complete reports selected by year, independent of other filters or pagination. ID lookups return one record and summaries: []; search by year for annual summaries.
When to use: "Are our 2025 1099s filed?", "Which vendors need a W-9?", or to refresh a known record's document links.
Workflow: Pass id alone, or omit id and use filters/pagination. Omit year for all years. Filters combine with AND; comma-separated statuses combine with OR. Continue with unchanged filters and next_cursor as starting_after; never sum repeated summaries across pages. Names can repeat, so counts describe records, not unique recipients. Missing reports are unknown; not_required reflects tracked records, not legal obligations. Read filing_status for progress even without PDFs. Links expire after five minutes; search again by id to refresh them. forms_not_ready means retry later.
The description explains the capability, when to use it, and what to expect.
Inputs84/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
id
Exact f1099_ public ID. Pass it alone to retrieve one record or refresh document links; omit for a filter search.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
year
Exact four-digit reporting year, not submission year. Omit for all years; no year defaults implicitly.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
filing_status
One or more comma-separated record statuses: review_required, w9_required, w9_requested, ready_to_file, filing, filed, not_required. Values combine with OR. For pending records use pending instead.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
pending
true selects w9_required, w9_requested, ready_to_file and filing; false selects all other statuses, including review_required and not_required. Omit for both.
Clear enough to supply this argument.
vendor_name
Case-insensitive exact display-name match; surrounding whitespace is ignored. No substring search; names are not unique.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
filed_elsewhere
true selects filed records completed outside Finta; false selects all other records, including pending records. Omit for both.
Clear enough to supply this argument.
limit
Records per page, from 1 to 500. Defaults to 100.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
starting_after
Opaque next_cursor from the previous page, unchanged. Never a form ID. Keep the same filters; omit for the first page.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "search_1099s",
"title": "Search 1099s",
"description": "Purpose: Search the company's tracked vendor 1099 filing records, or retrieve one by its f1099_ ID, including available W-9 and 1099 documents.\nNot for: Generating or filing forms, sending W-9 requests, changing records, determining legal obligations, or income/franchise returns (use search_taxes).\nReturns: data, has_more, next_cursor and summaries. Filter searches include annual filing status and counts for complete reports selected by year, independent of other filters or pagination. ID lookups return one record and summaries: []; search by year for annual summaries.\nWhen to use: \"Are our 2025 1099s filed?\", \"Which vendors need a W-9?\", or to refresh a known record's document links.\nWorkflow: Pass id alone, or omit id and use filters/pagination. Omit year for all years. Filters combine with AND; comma-separated statuses combine with OR. Continue with unchanged filters and next_cursor as starting_after; never sum repeated summaries across pages. Names can repeat, so counts describe records, not unique recipients. Missing reports are unknown; not_required reflects tracked records, not legal obligations. Read filing_status for progress even without PDFs. Links expire after five minutes; search again by id to refresh them. forms_not_ready means retry later.",
"inputSchema": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^f1099_[A-Za-z0-9]+$",
"minLength": 1,
"description": "Exact f1099_ public ID. Pass it alone to retrieve one record or refresh document links; omit for a filter search."
},
"year": {
"type": "integer",
"maximum": 9999,
"minimum": 1000,
"description": "Exact four-digit reporting year, not submission year. Omit for all years; no year defaults implicitly."
},
"limit": {
"type": "integer",
"maximum": 500,
"minimum": 1,
"description": "Records per page, from 1 to 500. Defaults to 100."
},
"pending": {
"type": "boolean",
"description": "true selects w9_required, w9_requested, ready_to_file and filing; false selects all other statuses, including review_required and not_required. Omit for both."
},
"vendor_name": {
"type": "string",
"minLength": 1,
"description": "Case-insensitive exact display-name match; surrounding whitespace is ignored. No substring search; names are not unique."
},
"filing_status": {
"type": "string",
"description": "One or more comma-separated record statuses: review_required, w9_required, w9_requested, ready_to_file, filing, filed, not_required. Values combine with OR. For pending records use pending instead."
},
"starting_after": {
"type": "string",
"description": "Opaque next_cursor from the previous page, unchanged. Never a form ID. Keep the same filters; omit for the first page."
},
"filed_elsewhere": {
"type": "boolean",
"description": "true selects filed records completed outside Finta; false selects all other records, including pending records. Omit for both."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: Search the company's tracked federal R&D credits by tax year and claim status, or retrieve one by its tcred_ ID.
Not for: Determining eligibility, calculating or claiming credits, submitting payroll credits, filing progress (use search_taxes), or 1099s.
Returns: data, has_more and next_cursor, with credit amounts, amount_basis, income-tax and payroll allocations, and payroll_submission (provider and status). Amounts are integer cents; divide by 100 for dollars. Null means unknown, never zero.
When to use: "How much R&D credit do we have for 2025?", "Was it claimed?", or "Does payroll submission need action?"
Workflow: Pass id alone for one record, or omit id and use filters/pagination. Omit year for all years. Filters combine with AND. Continue with the same filters and next_cursor as starting_after. State amount_basis when reporting amounts. claimed concerns the tax return; payroll_submission.status separately describes submission recorded in Finta, not provider acceptance or a refund received.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
id
Exact tcred_ public ID. Pass it alone to retrieve one record or refresh document links; omit for a filter search.
Clear enough to supply this argument.
type
Only research_and_development is supported today. Omit to list supported credits.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
year
Exact four-digit tax year. Omit for all years.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
claim_status
Status of claiming the credit on the tax return, separate from payroll submission.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Credits per page, from 1 to 500. Defaults to 100.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
starting_after
The next_cursor from the previous page, unchanged. Keep the same filters; omit for the first page.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "search_tax_credits",
"title": "Search tax credits",
"description": "Purpose: Search the company's tracked federal R&D credits by tax year and claim status, or retrieve one by its tcred_ ID.\nNot for: Determining eligibility, calculating or claiming credits, submitting payroll credits, filing progress (use search_taxes), or 1099s.\nReturns: data, has_more and next_cursor, with credit amounts, amount_basis, income-tax and payroll allocations, and payroll_submission (provider and status). Amounts are integer cents; divide by 100 for dollars. Null means unknown, never zero.\nWhen to use: \"How much R&D credit do we have for 2025?\", \"Was it claimed?\", or \"Does payroll submission need action?\"\nWorkflow: Pass id alone for one record, or omit id and use filters/pagination. Omit year for all years. Filters combine with AND. Continue with the same filters and next_cursor as starting_after. State amount_basis when reporting amounts. claimed concerns the tax return; payroll_submission.status separately describes submission recorded in Finta, not provider acceptance or a refund received.",
"inputSchema": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^tcred_[A-Za-z0-9]+$",
"minLength": 1,
"description": "Exact tcred_ public ID. Pass it alone to retrieve one record or refresh document links; omit for a filter search."
},
"type": {
"enum": [
"research_and_development"
],
"type": "string",
"description": "Only research_and_development is supported today. Omit to list supported credits."
},
"year": {
"type": "integer",
"maximum": 9999,
"minimum": 1000,
"description": "Exact four-digit tax year. Omit for all years."
},
"limit": {
"type": "integer",
"maximum": 500,
"minimum": 1,
"description": "Credits per page, from 1 to 500. Defaults to 100."
},
"claim_status": {
"enum": [
"undecided",
"not_claimed",
"pending",
"claimed"
],
"type": "string",
"description": "Status of claiming the credit on the tax return, separate from payroll submission."
},
"starting_after": {
"type": "string",
"description": "The next_cursor from the previous page, unchanged. Keep the same filters; omit for the first page."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: Search the company's income and Delaware franchise tax filings by filters, or retrieve one by its public ID.
Not for: 1099s (use search_1099s), R&D credits (use search_tax_credits), calculating tax owed, or filing or changing returns.
Returns: data, has_more and next_cursor, with filing progress, covered and unmapped jurisdictions, filing/extension timestamps, and available PDF links. Income jurisdictions share one filing record; status does not establish authority acceptance or tax payment.
When to use: "Have we filed our 2025 taxes?", "Which returns need review?", or to refresh a known filing's document links.
Workflow: Pass id alone for one record, or omit id and use filters/pagination. Omit year for all years. Filters combine with AND. Continue with the same filters and next_cursor as starting_after. Links expire after five minutes; search again by id to refresh them. Read filing_status, not PDF availability, for progress. Preserve unmapped_jurisdictions; taxes_not_ready means retry later.
The description explains the capability, when to use it, and what to expect.
Inputs93/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
id
Exact tax_income_ or tax_franchise_ public ID. Pass it alone to retrieve one record or refresh document links; omit for a filter search.
Clear enough to supply this argument.
type
income includes federal and state returns; franchise is Delaware franchise tax. Omit for both.
Clear enough to supply this argument.
jurisdiction
US for federal income tax, or a US state code such as US-CA or US-DE. Matches filings whose jurisdictions include this code.
Clear enough to supply this argument.
year
Exact four-digit tax year. Omit for all years; no year defaults implicitly.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
status
Filter by the returned filing_status. Omit for every status.
Clear enough to supply this argument.
limit
Filings per page, from 1 to 500. Defaults to 100.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
starting_after
The next_cursor from the previous page, unchanged. Keep the same filters; omit for the first page.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "search_taxes",
"title": "Search taxes",
"description": "Purpose: Search the company's income and Delaware franchise tax filings by filters, or retrieve one by its public ID.\nNot for: 1099s (use search_1099s), R&D credits (use search_tax_credits), calculating tax owed, or filing or changing returns.\nReturns: data, has_more and next_cursor, with filing progress, covered and unmapped jurisdictions, filing/extension timestamps, and available PDF links. Income jurisdictions share one filing record; status does not establish authority acceptance or tax payment.\nWhen to use: \"Have we filed our 2025 taxes?\", \"Which returns need review?\", or to refresh a known filing's document links.\nWorkflow: Pass id alone for one record, or omit id and use filters/pagination. Omit year for all years. Filters combine with AND. Continue with the same filters and next_cursor as starting_after. Links expire after five minutes; search again by id to refresh them. Read filing_status, not PDF availability, for progress. Preserve unmapped_jurisdictions; taxes_not_ready means retry later.",
"inputSchema": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^tax_(income|franchise)_[A-Za-z0-9]+$",
"minLength": 1,
"description": "Exact tax_income_ or tax_franchise_ public ID. Pass it alone to retrieve one record or refresh document links; omit for a filter search."
},
"type": {
"enum": [
"income",
"franchise"
],
"type": "string",
"description": "income includes federal and state returns; franchise is Delaware franchise tax. Omit for both."
},
"year": {
"type": "integer",
"maximum": 9999,
"minimum": 1000,
"description": "Exact four-digit tax year. Omit for all years; no year defaults implicitly."
},
"limit": {
"type": "integer",
"maximum": 500,
"minimum": 1,
"description": "Filings per page, from 1 to 500. Defaults to 100."
},
"status": {
"enum": [
"onboarding",
"preparing",
"review_required",
"filing",
"filed"
],
"type": "string",
"description": "Filter by the returned filing_status. Omit for every status."
},
"jurisdiction": {
"type": "string",
"description": "US for federal income tax, or a US state code such as US-CA or US-DE. Matches filings whose jurisdictions include this code."
},
"starting_after": {
"type": "string",
"description": "The next_cursor from the previous page, unchanged. Keep the same filters; omit for the first page."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: Record a Delaware franchise tax and annual report the company already filed outside Finta, with its PDF, exactly as uploading it on the Taxes page does.
Not for: Income tax returns (use upload_income_tax_return), or reports Finta is filing.
Returns: The year's Delaware franchise tax record, marked filed, with the PDF in documents.
When to use: "Upload our Delaware report", or moving a customer's filed reports from another provider into Finta.
Workflow: Get an upload URL with create_file_upload, PUT the PDF, then call this tool with the file ID. For a company with no records for that year, upload the return first, then the Delaware report.
Rules: Only available when the Taxes page offers declaring that year externally filed or adding a missing confirmation to a known external filing. Never replaces an existing PDF, changes a Finta report being prepared, with payment authorized or filing underway/already completed, or changes another tax year. Filling a missing external confirmation preserves the filing date. tax_year is the year the report covers, not the year it was filed. A 409 tax_upload_not_allowed is final for that filing state; do not upload a fresh file to bypass it.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
tax_year
The tax year the report covers, such as 2025 for the report filed in early 2026.
Clear enough to supply this argument.
file_id
The file_id from create_file_upload, after the PDF was PUT to its url.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "upload_delaware_franchise_tax_report",
"title": "Upload Delaware franchise tax report",
"description": "Purpose: Record a Delaware franchise tax and annual report the company already filed outside Finta, with its PDF, exactly as uploading it on the Taxes page does.\nNot for: Income tax returns (use upload_income_tax_return), or reports Finta is filing.\nReturns: The year's Delaware franchise tax record, marked filed, with the PDF in documents.\nWhen to use: \"Upload our Delaware report\", or moving a customer's filed reports from another provider into Finta.\nWorkflow: Get an upload URL with create_file_upload, PUT the PDF, then call this tool with the file ID. For a company with no records for that year, upload the return first, then the Delaware report.\nRules: Only available when the Taxes page offers declaring that year externally filed or adding a missing confirmation to a known external filing. Never replaces an existing PDF, changes a Finta report being prepared, with payment authorized or filing underway/already completed, or changes another tax year. Filling a missing external confirmation preserves the filing date. tax_year is the year the report covers, not the year it was filed. A 409 tax_upload_not_allowed is final for that filing state; do not upload a fresh file to bypass it.",
"inputSchema": {
"type": "object",
"required": [
"tax_year",
"file_id"
],
"properties": {
"file_id": {
"type": "string",
"pattern": "^file_[A-Za-z0-9]+$",
"description": "The file_id from create_file_upload, after the PDF was PUT to its url."
},
"tax_year": {
"type": "integer",
"maximum": 9999,
"minimum": 1000,
"description": "The tax year the report covers, such as 2025 for the report filed in early 2026."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: Record an income tax return the company already filed outside Finta, with its PDF, exactly as uploading it on the Taxes page does.
Not for: Delaware franchise tax reports (use upload_delaware_franchise_tax_report; this tool refuses them), returns Finta is preparing, or years other than last year and the year before.
Returns: The year's income tax record, marked filed, with the PDF in documents.
When to use: "Upload our 2025 return", or moving a customer's filed returns from another provider into Finta.
Workflow: Get an upload URL with create_file_upload, PUT the PDF, then call this tool with the file ID. For a company with no records for that year, upload the return first, then the Delaware report.
Rules: Only available when the Taxes page offers the income upload for that year. Creates a new income filing; never replaces a document or changes an existing Finta workflow. May create a missing externally filed Delaware record for the same year only when its filing status is already confirmed. Never starts Delaware preparation; existing records and other years remain untouched. Confirm the year, preparer and states with the user if the PDF doesn't make them clear. A 409 tax_upload_not_allowed is final for that filing state; do not upload a fresh file to bypass it.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tax_year
The tax year the return covers. Only last year or the year before.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tax_firm
The firm or person who prepared the return, such as "Fondo".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
states_filed
USPS codes of the states the return was filed in, such as ["CA"]. [] when no state return was filed.
Clear enough to supply this argument.
file_id
The file_id from create_file_upload, after the PDF was PUT to its url.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "upload_income_tax_return",
"title": "Upload income tax return",
"description": "Purpose: Record an income tax return the company already filed outside Finta, with its PDF, exactly as uploading it on the Taxes page does.\nNot for: Delaware franchise tax reports (use upload_delaware_franchise_tax_report; this tool refuses them), returns Finta is preparing, or years other than last year and the year before.\nReturns: The year's income tax record, marked filed, with the PDF in documents.\nWhen to use: \"Upload our 2025 return\", or moving a customer's filed returns from another provider into Finta.\nWorkflow: Get an upload URL with create_file_upload, PUT the PDF, then call this tool with the file ID. For a company with no records for that year, upload the return first, then the Delaware report.\nRules: Only available when the Taxes page offers the income upload for that year. Creates a new income filing; never replaces a document or changes an existing Finta workflow. May create a missing externally filed Delaware record for the same year only when its filing status is already confirmed. Never starts Delaware preparation; existing records and other years remain untouched. Confirm the year, preparer and states with the user if the PDF doesn't make them clear. A 409 tax_upload_not_allowed is final for that filing state; do not upload a fresh file to bypass it.",
"inputSchema": {
"type": "object",
"required": [
"tax_year",
"tax_firm",
"states_filed",
"file_id"
],
"properties": {
"file_id": {
"type": "string",
"pattern": "^file_[A-Za-z0-9]+$",
"description": "The file_id from create_file_upload, after the PDF was PUT to its url."
},
"tax_firm": {
"type": "string",
"minLength": 1,
"description": "The firm or person who prepared the return, such as \"Fondo\"."
},
"tax_year": {
"type": "integer",
"description": "The tax year the return covers. Only last year or the year before."
},
"states_filed": {
"type": "array",
"items": {
"enum": [
"AK",
"AL",
"AR",
"AZ",
"CA",
"CO",
"CT",
"DC",
"DE",
"FL",
"GA",
"HI",
"IA",
"ID",
"IL",
"IN",
"KS",
"KY",
"LA",
"MA",
"MD",
"ME",
"MI",
"MN",
"MO",
"MS",
"MT",
"NC",
"ND",
"NE",
"NH",
"NJ",
"NM",
"NV",
"NY",
"OH",
"OK",
"OR",
"PA",
"RI",
"SC",
"SD",
"TN",
"TX",
"UT",
"VA",
"VT",
"WA",
"WI",
"WV",
"WY"
],
"type": "string"
},
"description": "USPS codes of the states the return was filed in, such as [\"CA\"]. [] when no state return was filed."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Purpose: Send a question, feedback or bug report to Finta support, either for the user or on your own about these Finta tools. It arrives as an email from the user, and support replies to them by email.
Not for: Changing data in Finta. Getting an answer in this conversation; replies come by email later.
Returns: The ticket id, type and reported_by.
When to use: The user asks, such as "Ask Finta whether you can import from QuickBooks", "Tell Finta the upload keeps failing" or "Report this as a bug" (reported_by: user). Or on your own (reported_by: agent) when a Finta tool fails unexpectedly or returns something that looks wrong, when a tool's description or inputs misled you, or when no Finta tool can do what the user asked.
Workflow: Write the message yourself from what the user said and what happened in this conversation, and send it right away; don't ask the user to write, format or approve a draft. Then tell the user in one line what you sent and, when they asked, that support will reply by email. When reporting on your own, send it once per issue and carry on with the user's task.
Rules: Never include passwords, API keys or full account numbers. In your own reports, also leave out amounts and the names of merchants, accounts, people and files.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
type
"question" for something to answer, "bug" when something is broken, "feedback" for anything else.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
summary
A short headline that names the problem or request, like an issue title, such as "No tool to create categories" or "Balance sheet slow to load". It becomes the ticket's subject.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
message
Plain text for the support team: what the user wants or what went wrong, and what they or you were doing. Leave out the user's name, email and company; Finta adds who sent it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
reported_by
"user" when the user asked to send it, "agent" when you are reporting something on your own.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
model
The AI model you are, such as "claude-opus-5-5", if you know it. Leave it out rather than guess.
Explain what happens when this optional value is omitted.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "submit_feedback",
"title": "Submit feedback",
"description": "Purpose: Send a question, feedback or bug report to Finta support, either for the user or on your own about these Finta tools. It arrives as an email from the user, and support replies to them by email.\nNot for: Changing data in Finta. Getting an answer in this conversation; replies come by email later.\nReturns: The ticket id, type and reported_by.\nWhen to use: The user asks, such as \"Ask Finta whether you can import from QuickBooks\", \"Tell Finta the upload keeps failing\" or \"Report this as a bug\" (reported_by: user). Or on your own (reported_by: agent) when a Finta tool fails unexpectedly or returns something that looks wrong, when a tool's description or inputs misled you, or when no Finta tool can do what the user asked.\nWorkflow: Write the message yourself from what the user said and what happened in this conversation, and send it right away; don't ask the user to write, format or approve a draft. Then tell the user in one line what you sent and, when they asked, that support will reply by email. When reporting on your own, send it once per issue and carry on with the user's task.\nRules: Never include passwords, API keys or full account numbers. In your own reports, also leave out amounts and the names of merchants, accounts, people and files.",
"inputSchema": {
"type": "object",
"required": [
"type",
"summary",
"message",
"reported_by"
],
"properties": {
"type": {
"enum": [
"question",
"feedback",
"bug"
],
"type": "string",
"description": "\"question\" for something to answer, \"bug\" when something is broken, \"feedback\" for anything else."
},
"model": {
"type": "string",
"maxLength": 100,
"description": "The AI model you are, such as \"claude-opus-5-5\", if you know it. Leave it out rather than guess."
},
"message": {
"type": "string",
"maxLength": 10000,
"minLength": 1,
"description": "Plain text for the support team: what the user wants or what went wrong, and what they or you were doing. Leave out the user's name, email and company; Finta adds who sent it."
},
"summary": {
"type": "string",
"maxLength": 120,
"minLength": 1,
"description": "A short headline that names the problem or request, like an issue title, such as \"No tool to create categories\" or \"Balance sheet slow to load\". It becomes the ticket's subject."
},
"reported_by": {
"enum": [
"user",
"agent"
],
"type": "string",
"description": "\"user\" when the user asked to send it, \"agent\" when you are reporting something on your own."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
Loading score analytics…
Put your MCP to the test
A few tasks worth trying with this server, chosen from its reviewed tools. These have not been run.
01Search transactionsPurpose: Find the company's bank, card and reimbursement transactions in Finta by date, merchant, amount, category, source or status, with their stable txn_…
02Get balance sheetPurpose: Get the company's balance sheet as of one date: cash, assets, liabilities and equity.
03Get cash flow statementPurpose: Get the company's cash flow statement for one date range: cash from operating, investing and financing activities, and cash at the start and end.
04Get income statementPurpose: Get the company's income statement (profit and loss) for one date range: revenue, expenses, operating income, non-operating income, taxes and net in…
05List accountsPurpose: List the company's bank, credit card and other transaction-source accounts in Finta, with their stable acct_ IDs.
Want to run these tasks against your MCP server with us?
Finta setup, tools, quality score, publishing readiness, and alternatives.
How do I add Finta to Claude, ChatGPT, or Cursor?
Add Finta to Claude, ChatGPT, or Cursor by connecting its remote MCP URL in each client's MCP settings. In Claude, add a custom connector. In ChatGPT, add an MCP app. In Cursor, add an MCP server under Settings. The MCP URL is https://mcp.finta.com/mcp.
Is Finta MCP ready for ChatGPT and Claude?
As of October 15, 2026, Finta scores 96/100 on Manufact's MCP publishing checklist. The scan meets ChatGPT publishing checks and meets Claude publishing checks. Passing these checks does not guarantee marketplace approval.
How clear is Finta's MCP tool documentation?
As of October 15, 2026, Finta scores 84/100 in Manufact's review of tool titles, descriptions, input and output schemas, and behavior annotations. The review covers 43 of 43 discovered tools. The quality score measures documentation clarity; runtime behavior and marketplace readiness require separate checks.
What are the best alternatives to Finta?
As of October 15, 2026, alternatives to Finta in financial-services on the Manufact MCP catalog include Contract-Factory — Sociétés & SIREN, Kavara Kirk, CeylonCharts, Ramp Data, and Trade It.
How can Finta improve its MCP documentation?
create_team_invitation is the lowest-scoring reviewed tool at 64/100. No output schema is declared. Add one for structured results so clients can interpret returned fields. Open its review for feedback and a copyable fix prompt, then rerun the documentation review after updating your tool metadata.
Not your MCP?
Review any public or OAuth MCP server for protocol compatibility, tool documentation, and ChatGPT and Claude publishing readiness. No account required.