Skip to main content
Glama

Customer Management & Payment Plans MCP Server & Chatbot

This project provides two main components:

  1. MCP Server: A Model Context Protocol server for customer management, address lookup, and payment plan retrieval

  2. AI Chatbot: An OpenAI GPT-4o-mini powered chatbot that integrates with the MCP server via REST API

Features

MCP Server

  • ✅ MCP-compliant server implementation (stdio transport)

  • ✅ Bearer token authentication

  • ✅ Three integrated tools:

    • createCustomer - Customer registration with validation

    • getAddressByZipcode - Brazilian CEP address lookup

    • list_payment_plans - Payment plan retrieval (credit card, PIX, bank slip)

  • ✅ Required field validation

  • ✅ Comprehensive error handling

  • ✅ Development logging

  • ✅ TypeScript implementation

AI Chatbot

  • ✅ OpenAI GPT-4o-mini integration

  • ✅ Configurable tone/style via environment variables

  • ✅ REST API endpoint (/api/chat)

  • ✅ Automatic MCP tool invocation based on conversation

  • ✅ Conversation history management

  • ✅ Express-based HTTP server

Prerequisites

  • Node.js 18+

  • Yarn package manager

Installation

  1. Install dependencies:

yarn install
  1. Configure environment variables:

Copy the example file and edit with your values:

cp .env.example .env

Edit .env:

# MCP Server Configuration CUSTOMER_API_HOST=https://your-api-host.com CUSTOMER_API_TOKEN=your_bearer_token_here NODE_ENV=development # Payment Plans Configuration CHECKOUT_ID=your_checkout_id_here PRODUCT_ID=36,42 # Chatbot Configuration OPENAI_API_KEY=sk-your-openai-api-key-here OPENAI_MODEL=gpt-5-nano AGENT_TONE=Professional, helpful, and efficient # Alternative: AGENT_STYLE=Encouraging, visionary, witty # Chatbot Server Port (optional, defaults to 3000) CHATBOT_PORT=3000

Note: AGENT_TONE or AGENT_STYLE controls the chatbot's personality.

Usage

Running the MCP Server (standalone)

Development Mode:

yarn dev

Or with watch mode:

yarn watch

Production Mode:

# Build yarn build # Run yarn start

Running the AI Chatbot Server

Development Mode:

yarn chatbot:dev

Production Mode:

# Build yarn chatbot:build # Run yarn chatbot:start

The chatbot server will start on port 3000 (or your configured CHATBOT_PORT).

Chatbot API Endpoints

POST /api/chat

Send a message to the chatbot:

curl -X POST http://localhost:3000/api/chat \ -H "Content-Type: application/json" \ -d '{ "message": "Register a customer: John Doe, john@example.com, +1234567890", "context": {} }'

Response:

{ "reply": "Great! I've successfully registered John Doe as a customer. The customer ID is 12345.", "actions": [ { "tool": "createCustomer", "input": { "name": "John Doe", "email": "john@example.com", "phone": "+1234567890" }, "result": { "status": "success", "customerId": 12345, "data": {...} } } ] }

POST /api/chat/reset

Reset the conversation history:

curl -X POST http://localhost:3000/api/chat/reset

GET /health

Health check:

curl http://localhost:3000/health

MCP Tools

Tool 1: createCustomer

Required Parameters

  • name (string): Customer full name

  • email (string): Customer email address (validated)

  • phone (string): Customer phone number

Optional Parameters

  • retention (boolean): Retention flag

  • identification (string): Customer ID document (e.g., CPF)

  • zipcode (string): ZIP/Postal code

  • state (string): State/Province

  • street (string): Street name

  • number (string): Street number

  • neighborhood (string): Neighborhood

  • city (string): City

  • list_ids (number): List ID for categorization

  • create_deal (boolean): Whether to create a deal

  • tags (string): Tags for the customer

  • url (string): URL reference

  • utm_term (string): UTM term parameter

  • utm_medium (string): UTM medium parameter

  • utm_source (string): UTM source parameter

  • utm_campaign (string): UTM campaign parameter

  • company_id (string): Company ID

  • utm_content (string): UTM content parameter

Example Request

{ "name": "Tony Stark", "email": "newone@avengers.com", "phone": "(12) 99756-0001", "city": "São Paulo", "retention": true, "identification": "251.482.720-58", "tags": "coyo-jan" }

Example Success Response

{ "status": "success", "customerId": 12345, "data": { "id": 12345, "name": "Tony Stark", "email": "newone@avengers.com", ... } }

Example Error Response

{ "status": "error", "error": "Validation failed", "errors": [ "email is required", "phone is required" ] }

Tool 2: getAddressByZipcode

Lookup Brazilian addresses by CEP (zipcode).

Required Parameters

  • zipcode (string): Brazilian CEP in format XXXXX-XXX or XXXXXXXX (8 digits)

Example Request

{ "zipcode": "01310-100" }

Example Success Response

{ "cep": "01310-100", "logradouro": "Avenida Paulista", "bairro": "Bela Vista", "localidade": "São Paulo", "uf": "SP" }

Tool 3: list_payment_plans

Retrieve available payment plans for checkout offers. Configuration is read from environment variables (CHECKOUT_ID and PRODUCT_ID).

Required Parameters

None - the tool uses configuration from environment variables.

Configuration (Environment Variables)

  • CHECKOUT_ID (string): Checkout page identifier

  • PRODUCT_ID (string): Comma-separated product IDs (e.g., "36,42")

Example Response

{ "checkout_id": "checkout_abc123", "product_id": "36,42", "plans": { "credit_card": [ { "installments": 1, "value": 1096.00 }, { "installments": 2, "value": 548.00 }, { "installments": 3, "value": 365.33 }, { "installments": 6, "value": 182.67 }, { "installments": 12, "value": 91.33 } ], "pix": [ { "value": 1096.00 } ], "bank_slip": [ { "value": 1096.00 } ] }, "payment_summary": "Temos pagamentos em até 12x de R$ 91,33 no cartão de crédito, ou à vista no PIX por R$ 1.096,00 ou boleto por R$ 1.096,00." }

Notes

  • The API is called once with the full product_id string (comma-separated)

  • Backend processes multiple product IDs and returns combined payment conditions

  • Fine, fine_tax, and late_interest fields are automatically ignored

  • Payment summary is generated in Portuguese (Brazil)

Example Error Response

{ "error": "Request failed with status code 401", "statusCode": 401 }

Configuring with MCP Clients

To use this server with an MCP-compatible client (like Claude Desktop), add the following to your MCP settings configuration:

{ "mcpServers": { "customer-registration": { "command": "node", "args": ["/absolute/path/to/mcpNova/build/index.js"], "env": { "CUSTOMER_API_HOST": "https://your-api-host.com", "CUSTOMER_API_TOKEN": "your_bearer_token_here", "NODE_ENV": "production", "CHECKOUT_ID": "your_checkout_id", "PRODUCT_ID": "36,42" } } } }

How the Chatbot Works

  1. User sends a message to /api/chat

  2. Chatbot adds message to conversation history

  3. OpenAI GPT-4o-mini processes the message with configured system prompt

  4. If LLM determines an action is needed (e.g., createCustomer, getAddressByZipcode, list_payment_plans), it responds with JSON

  5. Chatbot extracts the action and calls MCP server via stdio

  6. MCP server executes the appropriate tool:

    • Customer registration via external API

    • Address lookup via ViaCEP

    • Payment plans retrieval via external API

  7. Result is returned to LLM for a friendly follow-up message in Portuguese

  8. Final response sent back to user

Example Chatbot Conversations

Customer Registration:

User: Preciso cadastrar um cliente: João Silva, joao@email.com, (11) 98765-4321

Chatbot: Perfeito! Cadastrei o João Silva com sucesso. O ID do cliente é 67890.

Address Lookup:

User: Qual endereço do CEP 01310-100?

Chatbot: `O CEP 01310-100 corresponde a:

  • Avenida Paulista

  • Bairro: Bela Vista

  • São Paulo - SP`

Payment Plans:

User: Quais são as formas de pagamento?

Chatbot: `Temos as seguintes opções:

  • Cartão de crédito: até 12x de R$ 91,33

  • PIX à vista: R$ 1.096,00

  • Boleto à vista: R$ 1.096,00`

Multi-turn with Address:

User: Quero cadastrar um cliente

Chatbot: `Claro! Preciso de:

  • Nome completo

  • E-mail

  • Telefone`

User: Nome: Maria Santos, Email: maria@email.com, Telefone: (21) 99999-8888, CEP: 20040-020

Chatbot: (looks up CEP) Encontrei o endereço: Avenida Rio Branco, Centro, Rio de Janeiro - RJ. Vou cadastrar a Maria Santos com essas informações.

(creates customer)

Chatbot: Pronto! Maria Santos cadastrada com sucesso. ID: 11223

Project Structure

mcpNova/ ├── src/ │ ├── index.ts # MCP Server (stdio) │ ├── chatbotServer.ts # Express REST API server │ └── services/ │ ├── customerService.ts # Customer API integration │ ├── viaCepService.ts # Brazilian address lookup │ ├── paymentPlansService.ts # Payment plans retrieval │ ├── mcpClient.ts # MCP client (stdio communication) │ └── chatbotService.ts # OpenAI integration & logic ├── build/ # Compiled TypeScript ├── package.json ├── tsconfig.json ├── .env # Environment variables (gitignored) ├── .env.example # Environment template └── README.md

API Endpoint

POST https://{{host}}/api/v1/customers

Headers:

  • Authorization: Bearer {{TOKEN}}

  • Content-Type: application/json

Development Logging

When NODE_ENV=development, the server logs:

  • Request URLs and payloads

  • Response status and data

  • API errors with details

Error Handling

The server handles:

  • Missing or invalid required fields

  • HTTP errors from the external API

  • Network connectivity issues

  • Invalid Bearer tokens

  • Malformed requests

Security

  • Environment variables are used for sensitive data (API host and token)

  • .env files are gitignored

  • Bearer token is never logged or exposed

  • Email validation prevents basic injection attempts

License

MIT

A
security – no known vulnerabilities
F
license - not found
A
quality - confirmed to work

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/rodrigoai/mcpNova'

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