Skip to main content
Glama
bquigley1

Finix MCP Server

by bquigley1

create_seller

Create a new seller identity in Finix by providing required underwriting data including contact information, business details, and operational descriptions.

Instructions

This tool creates a new Seller Identity in Finix with full underwriting data.

Required arguments:

  • email (str): The email address of the seller.

  • first_name (str): The first name of the primary contact.

  • last_name (str): The last name of the primary contact.

  • business_name (str): The legal business name.

  • business_type (str): The business type (e.g., INDIVIDUAL_SOLE_PROPRIETORSHIP, CORPORATION, etc.).

  • business_description (str): Description of the business for underwriting.

Optional arguments include extensive business and underwriting data fields. See the schema for complete field descriptions.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
emailYesThe email address of the seller
first_nameYesThe first name of the primary contact
last_nameYesThe last name of the primary contact
business_nameYesThe legal business name
business_typeYesThe business type
business_descriptionYesDescription of the business for underwriting
phoneNo
business_phoneNo
business_tax_idNo
tax_idNo
urlNo
personal_addressNo
business_addressNo
doing_business_asNo
default_statement_descriptorNo
titleNo
principal_percentage_ownershipNo
mccNo
ownership_typeNo
dobNo
incorporation_dateNo
annual_card_volumeNo
max_transaction_amountNo
ach_max_transaction_amountNo
has_accepted_credit_cards_previouslyNo
annual_ach_volumeNo
average_ach_transfer_amountNo
average_card_transfer_amountNo
card_volume_distributionNo
volume_distribution_by_business_typeNo
refund_policyNo
merchant_agreement_acceptedNo
merchant_agreement_timestampNo
merchant_agreement_ip_addressNo
merchant_agreement_user_agentNo
credit_check_allowedNo
credit_check_timestampNo
credit_check_ip_addressNo
credit_check_user_agentNo
tagsNo

Implementation Reference

  • The handler function for the 'create_seller' tool. It constructs a payload from the input parameters, including entity details and optional underwriting data, then posts to the Finix /identities endpoint to create a new seller identity.
    const createSeller = async (client: FinixClient, _context: FinixContext, params: any): Promise<any> => {
      try {
        if (!client.hasCredentials()) {
          throw new Error('Finix username and password are required for this operation. Please configure FINIX_USERNAME and FINIX_PASSWORD in your environment.');
        }
    
        const {
          email, first_name, last_name, business_name, business_type, business_description,
          phone, business_phone, business_tax_id, tax_id, url,
          personal_address, business_address,
          doing_business_as, default_statement_descriptor, title, principal_percentage_ownership,
          mcc, ownership_type, dob, incorporation_date,
          annual_card_volume, max_transaction_amount, ach_max_transaction_amount,
          has_accepted_credit_cards_previously,
          annual_ach_volume, average_ach_transfer_amount, average_card_transfer_amount,
          card_volume_distribution, volume_distribution_by_business_type, refund_policy,
          merchant_agreement_accepted, merchant_agreement_timestamp, merchant_agreement_ip_address, merchant_agreement_user_agent,
          credit_check_allowed, credit_check_timestamp, credit_check_ip_address, credit_check_user_agent,
          tags
        } = params;
    
        const payload: any = {
          type: 'BUSINESS',
          identity_roles: ['SELLER'],
          entity: {
            email,
            first_name,
            last_name,
            business_name,
            business_type,
            ...(phone && { phone }),
            ...(business_phone && { business_phone }),
            ...(business_tax_id && { business_tax_id }),
            ...(tax_id && { tax_id }),
            ...(url && { url }),
            ...(personal_address && { personal_address }),
            ...(business_address && { business_address }),
            ...(doing_business_as && { doing_business_as }),
            ...(default_statement_descriptor && { default_statement_descriptor }),
            ...(title && { title }),
            ...(principal_percentage_ownership !== undefined && { principal_percentage_ownership }),
            ...(mcc && { mcc }),
            ...(ownership_type && { ownership_type }),
            ...(dob && { dob }),
            ...(incorporation_date && { incorporation_date }),
            ...(annual_card_volume !== undefined && { annual_card_volume }),
            ...(max_transaction_amount !== undefined && { max_transaction_amount }),
            ...(ach_max_transaction_amount !== undefined && { ach_max_transaction_amount }),
            ...(has_accepted_credit_cards_previously !== undefined && { has_accepted_credit_cards_previously })
          },
          ...(tags && { tags })
        };
    
        // Build additional underwriting data if any fields are provided
        const underwritingData: any = {};
        if (business_description) underwritingData.business_description = business_description;
        if (annual_ach_volume !== undefined) underwritingData.annual_ach_volume = annual_ach_volume;
        if (average_ach_transfer_amount !== undefined) underwritingData.average_ach_transfer_amount = average_ach_transfer_amount;
        if (average_card_transfer_amount !== undefined) underwritingData.average_card_transfer_amount = average_card_transfer_amount;
        if (card_volume_distribution) underwritingData.card_volume_distribution = card_volume_distribution;
        if (volume_distribution_by_business_type) underwritingData.volume_distribution_by_business_type = volume_distribution_by_business_type;
        if (refund_policy) underwritingData.refund_policy = refund_policy;
        if (merchant_agreement_accepted !== undefined) underwritingData.merchant_agreement_accepted = merchant_agreement_accepted;
        if (merchant_agreement_timestamp) underwritingData.merchant_agreement_timestamp = merchant_agreement_timestamp;
        if (merchant_agreement_ip_address) underwritingData.merchant_agreement_ip_address = merchant_agreement_ip_address;
        if (merchant_agreement_user_agent) underwritingData.merchant_agreement_user_agent = merchant_agreement_user_agent;
        if (credit_check_allowed !== undefined) underwritingData.credit_check_allowed = credit_check_allowed;
        if (credit_check_timestamp) underwritingData.credit_check_timestamp = credit_check_timestamp;
        if (credit_check_ip_address) underwritingData.credit_check_ip_address = credit_check_ip_address;
        if (credit_check_user_agent) underwritingData.credit_check_user_agent = credit_check_user_agent;
    
        if (Object.keys(underwritingData).length > 0) {
          payload.additional_underwriting_data = underwritingData;
        }
    
        const response = await client.post('/identities', payload);
        
        if (response.error) {
          throw new Error(`Error creating seller identity: ${response.error.message}`);
        }
        
        const identity = response.data;
        
        // Return clean data without _links
        const { _links, ...cleanIdentity } = identity;
        return cleanIdentity;
    
      } catch (error) {
        throw error;
      }
    };
  • Zod schema defining all input parameters for the create_seller tool, including required fields like email, names, business details, and extensive optional underwriting and address fields.
    const createSellerParameters = () => z.object({
      // Required basic info
      email: z.string().email().describe('The email address of the seller'),
      first_name: z.string().describe('The first name of the primary contact'),
      last_name: z.string().describe('The last name of the primary contact'),
      business_name: z.string().describe('The legal business name'),
      business_type: z.enum([
        'INDIVIDUAL_SOLE_PROPRIETORSHIP', 'CORPORATION', 'LIMITED_LIABILITY_COMPANY',
        'PARTNERSHIP', 'ASSOCIATION', 'GOVERNMENT_AGENCY', 'OTHER'
      ]).describe('The business type'),
      business_description: z.string().describe('Description of the business for underwriting'),
    
      // Business contact info
      phone: z.string().optional().describe('Personal phone number'),
      business_phone: z.string().optional().describe('Business phone number'),
      business_tax_id: z.string().optional().describe('Business tax ID (EIN)'),
      tax_id: z.string().optional().describe('Personal tax ID (SSN)'),
      url: z.string().optional().describe('Business website URL'),
    
      // Addresses
      personal_address: z.object({
        line1: z.string().describe('Address line 1'),
        line2: z.string().optional().describe('Address line 2'),
        city: z.string().describe('City'),
        region: z.string().describe('State/Region (e.g., CA)'),
        postal_code: z.string().describe('Postal/ZIP code'),
        country: z.string().default('USA').describe('Country code')
      }).optional().describe('Personal address of the primary contact'),
    
      business_address: z.object({
        line1: z.string().describe('Address line 1'),
        line2: z.string().optional().describe('Address line 2'),
        city: z.string().describe('City'),
        region: z.string().describe('State/Region (e.g., CA)'),
        postal_code: z.string().describe('Postal/ZIP code'),
        country: z.string().default('USA').describe('Country code')
      }).optional().describe('Business address'),
    
      // Business details
      doing_business_as: z.string().optional().describe('DBA name'),
      default_statement_descriptor: z.string().optional().describe('Statement descriptor for transactions'),
      title: z.string().optional().describe('Title of the primary contact (e.g., CEO)'),
      principal_percentage_ownership: z.number().min(0).max(100).optional().describe('Ownership percentage'),
      mcc: z.string().optional().describe('Merchant Category Code'),
      ownership_type: z.enum(['PRIVATE', 'PUBLIC']).optional().describe('Ownership type'),
    
      // Dates
      dob: z.object({
        year: z.number().int().describe('Birth year'),
        month: z.number().int().min(1).max(12).describe('Birth month (1-12)'),
        day: z.number().int().min(1).max(31).describe('Birth day (1-31)')
      }).optional().describe('Date of birth of primary contact'),
    
      incorporation_date: z.object({
        year: z.number().int().describe('Incorporation year'),
        month: z.number().int().min(1).max(12).describe('Incorporation month (1-12)'),
        day: z.number().int().min(1).max(31).describe('Incorporation day (1-31)')
      }).optional().describe('Date of business incorporation'),
    
      // Financial info
      annual_card_volume: z.number().optional().describe('Annual card processing volume in cents'),
      max_transaction_amount: z.number().optional().describe('Maximum single transaction amount in cents'),
      ach_max_transaction_amount: z.number().optional().describe('Maximum ACH transaction amount in cents'),
      has_accepted_credit_cards_previously: z.boolean().optional().describe('Has accepted credit cards before'),
    
      // Underwriting data
      annual_ach_volume: z.number().optional().describe('Annual ACH volume in cents'),
      average_ach_transfer_amount: z.number().optional().describe('Average ACH transfer amount in cents'),
      average_card_transfer_amount: z.number().optional().describe('Average card transfer amount in cents'),
      
      card_volume_distribution: z.object({
        card_present_percentage: z.number().min(0).max(100).describe('Card present percentage'),
        mail_order_telephone_order_percentage: z.number().min(0).max(100).describe('MOTO percentage'),
        ecommerce_percentage: z.number().min(0).max(100).describe('Ecommerce percentage')
      }).optional().describe('Card volume distribution'),
    
      volume_distribution_by_business_type: z.object({
        business_to_business_volume_percentage: z.number().min(0).max(100).describe('B2B percentage'),
        business_to_consumer_volume_percentage: z.number().min(0).max(100).describe('B2C percentage'),
        consumer_to_consumer_volume_percentage: z.number().min(0).max(100).describe('C2C percentage'),
        person_to_person_volume_percentage: z.number().min(0).max(100).describe('P2P percentage'),
        other_volume_percentage: z.number().min(0).max(100).describe('Other percentage')
      }).optional().describe('Volume distribution by business type'),
    
      refund_policy: z.enum([
        'NO_REFUNDS', 'REFUNDS_WITH_RESTOCKING_FEE', 'MERCHANDISE_EXCHANGE_ONLY', 
        'FULL_REFUNDS', 'OTHER'
      ]).optional().describe('Refund policy'),
    
      // Agreement and credit check info
      merchant_agreement_accepted: z.boolean().optional().describe('Merchant agreement accepted'),
      merchant_agreement_timestamp: z.string().optional().describe('When agreement was accepted (ISO 8601)'),
      merchant_agreement_ip_address: z.string().optional().describe('IP address when agreement was accepted'),
      merchant_agreement_user_agent: z.string().optional().describe('User agent when agreement was accepted'),
    
      credit_check_allowed: z.boolean().optional().describe('Credit check allowed'),
      credit_check_timestamp: z.string().optional().describe('When credit check was authorized (ISO 8601)'),
      credit_check_ip_address: z.string().optional().describe('IP address for credit check'),
      credit_check_user_agent: z.string().optional().describe('User agent for credit check'),
    
      // Tags
      tags: z.record(z.string()).optional().describe('Key-value pairs for tagging')
    });
  • Tool factory definition registering the 'create_seller' tool, specifying method name, description, parameters, annotations, and linking to the execute handler.
    const tool: ToolFactory = () => ({
      method: 'create_seller',
      name: 'Create Seller Identity',
      description: createSellerPrompt(),
      parameters: createSellerParameters(),
      annotations: createSellerAnnotations(),
      actions: {
        identities: {
          create: true
        }
      },
      execute: createSeller
    });
  • Central registration of all tools, including createSeller, in the allTools array for export and use in MCP.
    export const allTools: ToolFactory[] = [
      // Search & Documentation
      searchDocs,
      
      // Identities (Buyers/Sellers)
      createBuyer,
      createSeller,
      listBuyers,
      listSellers,
      
      // Payment Links
      createPaymentLink,
    ];
  • src/tools/index.ts:8-8 (registration)
    Import of the createSeller tool module.
    import createSeller from './identities/createSeller.js';
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for behavioral disclosure. While 'creates' implies a write/mutation operation, the description doesn't address critical behavioral aspects: required permissions, whether this is an irreversible creation, rate limits, error conditions, or what happens on success (e.g., returns a seller ID). For a creation tool with zero annotation coverage, this is a significant gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficiently structured with a clear purpose statement upfront, followed by required arguments listing, and a note about optional arguments. Every sentence serves a purpose, though the transition to 'See the schema for complete field descriptions' could be slightly more integrated. Overall, it's appropriately sized for a complex tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (40 parameters, no output schema, no annotations), the description is partially complete. It adequately covers the purpose and required parameters but leaves significant gaps: no behavioral context, no output information, minimal guidance on optional parameters, and no usage guidelines. For a creation tool with this complexity, more comprehensive coverage would be expected.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description explicitly lists and describes all 6 required parameters, adding clear semantic meaning beyond the schema. With only 15% schema description coverage, the description compensates well for the schema's deficiencies by explaining the core required fields. However, it doesn't provide similar semantic context for the 34 optional parameters, leaving them largely undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action ('creates a new Seller Identity'), target resource ('in Finix'), and scope ('with full underwriting data'). It distinguishes this from sibling tools like 'create_buyer' by specifying it's for seller identities rather than buyers or other entities.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like 'create_buyer' or 'list_sellers'. It mentions 'full underwriting data' but doesn't specify prerequisites, dependencies, or when this tool would be inappropriate. The agent receives no contextual usage instructions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/bquigley1/finix-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server