Zenskar MCP Server
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ZENSKAR_API_KEY | No | Your Zenskar API key for authentication. | |
| ZENSKAR_AUTH_TOKEN | No | Bearer token from browser devtools (alternative to API key, short-lived). | |
| ZENSKAR_ORGANIZATION | No | Your Zenskar Organization ID from the dashboard. |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| listCustomersB | Retrieve a paginated list of customers, with options for searching, filtering by ID, external ID, email, phone number, communication status, auto-charge status, creation date, customer name, and business entity ID. |
| getCustomerByIdC | Retrieve details for a specific customer by their ID. |
| listContactsC | Retrieve a paginated list of contacts. |
| getContactByIdA | Retrieve details for a specific contact by their ID. |
| listInvoicesB | Retrieve a paginated list of invoices, with options for filtering by customer, status, amounts, due date, creation date, and related customer/contract details. |
| getInvoiceByIdC | Retrieve details for a specific invoice by its ID. |
| getInvoiceGenerationStatusC | Get the generation status of a specific invoice. |
| getInvoiceByExternalIdC | Retrieve details for an invoice using its external ID. |
| downloadInvoiceC | Download an invoice in JSON format. |
| getInvoicePreviewHtmlA | Get the rendered HTML preview of an invoice. Returns the invoice as it would appear when sent to the customer. Use this to show the customer-facing invoice layout. |
| getInvoiceContractJsonActualsB | Get contract actuals in JSON format for a specific invoice. |
| getInvoicePaymentsA | Get successful payments currently associated with a specific invoice. This view may omit refund records and non-success payment states. |
| generateInvoicePaymentLinkC | Generate a payment link for a specific invoice. |
| payInvoiceA | Initiate payment for an invoice using a payload. MONEY-MOVING ACTION — only call when the user explicitly authorizes payment for this specific invoice. Host enforces user confirmation via the approval gate; do NOT ask the user to re-confirm before calling. |
| getInvoiceLineItemsC | Get details about the invoice line items, features, and pricing models. |
| getInvoiceSummaryB | Get a summary of a specific invoice. |
| getAllInvoiceTagsB | Get all available tags for invoices. |
| getCustomerPortalConfigurationC | Retrieve the customer portal configuration. |
| listAggregatesB | List Billable Metrics in paginated form, with filtering by ID, name, and data source. |
| getAggregateSchemasA | Show the underlying storage/schema definitions for Billable Metrics. Mainly useful for advanced debugging, SQL/schema inspection, and integration work rather than day-to-day business operations. |
| getAggregateEstimatesC | Get Billable Metric estimates based on the specified criteria. |
| getAggregateByIdB | Get the details of a Billable Metric by its ID. |
| getAggregateLogsB | Get logs related to a Billable Metric (also called an aggregate) by ID, with optional date and customer filters. |
| createAggregateB | Create a new Billable Metric. Requires a name, data schema, aggregation queries, visual query builder config, and a data source. Host enforces user confirmation via the approval gate; do NOT ask the user to re-confirm before calling. |
| updateAggregateA | Update an existing Billable Metric. All body fields are optional — only send fields you want to change. Host enforces user confirmation via the approval gate; do NOT ask the user to re-confirm before calling. |
| deleteAggregateA | Permanently delete a Billable Metric. DESTRUCTIVE: cannot be undone. ONLY call when the user explicitly says 'delete' or 'remove' for THIS billable metric. Host enforces user confirmation via the approval gate; do NOT ask the user to re-confirm before calling. |
| listRawMetricsC | List Usage Events. Supports filtering by ID, name, and API slug. |
| createRawMetricA | Create a new Usage Event schema. This defines the schema used for ingesting usage events. Host enforces user confirmation via the approval gate; do NOT ask the user to re-confirm before calling. |
| getRawMetricByIdC | Get Usage Event details by ID. |
| getRawMetricLogsA | Get recent Usage Event rows for a resource by ID. Returns the most recent event rows; backend does NOT support filters, pagination, ordering, or aggregation on this endpoint. For filtered/aggregated queries use the aggregate endpoints. |
| getRawMetricBySlugB | Get Usage Event details by API slug. |
| getInvoicePaymentsByIdA | Get successful payments associated with a specific invoice ID. This endpoint is success-only and may not show refund rows. |
| getInvoicePaymentsWithoutRefundsA | Get original payment records for an invoice, excluding refund payment rows. Refunded or partially refunded original payments may still appear here. |
| getPaymentByIdB | Retrieve details for a specific payment by its ID. |
| getCurrentDateTimeC | Get the current system date and time in multiple formats for temporal context |
| listAllPaymentsC | Retrieve a paginated list of all payments, including refund records, with extensive filtering and sorting options. |
| createContractPromptA | Save a reusable AI extraction prompt that drives contract data extraction (used by extractContractFromRaw). Use this to create / update / version the instructions the AI follows when parsing raw contract text. |
| listContractsB | Retrieve a paginated list of contracts, with extensive options for filtering by ID, customer ID, name, start date, end date, creation date, and status. |
| createEntitlementA | Creates a new entitlement in the system with various attributes including name, description, type, units, and product association. Host enforces user confirmation via the approval gate; do NOT ask the user to re-confirm before calling. |
| listEntitlementsB | List entitlements in paginated form, with filtering by ID, name, type, product, and active status. |
| getEntitlementByIdA | Get the details of an entitlement by its ID. |
| updateEntitlementA | Update an existing entitlement's details. Host enforces user confirmation via the approval gate; do NOT ask the user to re-confirm before calling. |
| deleteEntitlementA | Permanently delete an entitlement. DESTRUCTIVE: cannot be undone. ONLY call when the user explicitly says 'delete' or 'remove' for THIS entitlement. Host enforces user confirmation via the approval gate; do NOT ask the user to re-confirm before calling. |
| approveInvoiceA | Approve an invoice; sets status to approved. Host enforces user confirmation via the approval gate; do NOT ask the user to re-confirm before calling. |
| recogniseRevenueA | Recognize revenue for the organization up to a specified end_date. Host enforces user confirmation via the approval gate; do NOT ask the user to re-confirm before calling. |
| listRevenuePostingsB | Retrieve a paginated list of revenue postings (per-period revenue allocations against revenue contracts and performance obligations). Supports filtering by contract, revenue contract, performance obligation, posting date, and currency. |
| refreshRevenuePostingsA | Recalculate and upsert revenue postings for a specific revenue contract item / performance obligation at a given posting date. All five identifiers are required (the backend rejects partial inputs). Host enforces user confirmation via the approval gate; do NOT ask the user to re-confirm before calling. |
| createBusinessEntityA | Creates a new business entity in the system with various attributes including name, address, contact details, tax configuration, and logo. Host enforces user confirmation via the approval gate; do NOT ask the user to re-confirm before calling. |
| createCustomerC | Creates a new customer in the system with various attributes including address, tax info, and contact details. |
| ingestRawMetricEventA | Ingest a Usage Event for the specified resource slug. Host enforces user confirmation via the approval gate; do NOT ask the user to re-confirm before calling. |
| extractContractFromRawA | Extract structured contract data from raw text content using AI. This tool analyzes natural language contract descriptions and extracts key fields like dates, products, pricing, and billing terms. The extracted data can then be used to create a customer and contract via createCustomer and createContract tools. |
| createContractA | Create a new contract in Zenskar. Use this after extracting contract data via extractContractFromRaw and creating a customer via createCustomer. The contract includes customer details, pricing phases, products, and billing configuration. |
| getContractByIdA | Retrieve a contract by its ID, including all phases, pricings, customer details, custom attributes, and renewal policy. Essential for cloning contracts for renewals, reviewing terms before amendments, and validating contract state. |
| updateContractA | Update an existing contract. This is a PUT endpoint — you MUST fetch the contract first with getContractById, then send ALL required fields including phases. Without phases the API returns 500. Copy phases from the GET response (each phase needs name, start_date, end_date at minimum). Status: draft, active, paused, expired, disputed. Renewal: renew_with_default_contract, renew_with_existing, do_not_renew. |
| deleteContractA | Permanently delete a DRAFT contract. ONLY works on contracts with status='draft'. Do NOT call on ACTIVE, EXPIRED, or PAUSED contracts. DESTRUCTIVE: removes all phases, products, and pricing associations. NEVER call as automatic recovery from another failed operation (e.g., do not retry as a fallback after expireContract or voidInvoice fails). ONLY call when the user explicitly says 'delete' or 'remove' for THIS draft contract. If a non-destructive action fails, surface the error verbatim and stop. Host enforces user confirmation via the approval gate; do NOT ask the user to re-confirm before calling. |
| getContractAmendmentsB | Retrieve all amendments for a contract. Shows history of changes, expansions, upgrades, and modifications made to the contract over time. |
| getContractBillingCyclesA | Returns the contract's pre-computed billing cycles as a list of {name, start_date, end_date, bill_for_date, billing_cycle_start_day}. REQUIRED before calling generateInvoice. Workflow: (1) call this tool, (2) pick the cycle entry whose date range covers the period you want to invoice, (3) pass that entry's |
| createContractPhaseA | Add a new phase to an existing contract. Use this for add-on expansions, mid-contract changes, or creating distinct billing periods with different pricing. Phase type enum: active, pause, trial. |
| createContractPhasePricingA | Add pricing to a contract phase. REQUIRED: pass EXACTLY ONE of |
| expireContractA | Expire an ACTIVE or PAUSED contract by adjusting its end_date. Allowed status transitions: ACTIVE→EXPIRED, PAUSED→EXPIRED. EXPIRED is terminal — calling on an already-expired contract returns 400; do NOT retry, do NOT escalate to deleteContract or any other destructive tool as a fallback. Verify contract.status via getContractById before calling. Idempotency: NO. The contract expires at end of day 23:59:59.999999. Host enforces user confirmation via the approval gate; do NOT ask the user to re-confirm before calling. |
| voidInvoiceA | Void an invoice. ONLY works on approved or paid invoices with invoice_total == 0 (zero-balance, typically after a full credit-note offset). For non-zero approved invoices, issue a credit note via createInvoiceCreditNote first to bring the balance to zero, then void. If the call returns INVOICE_CANNOT_BE_VOIDED, surface that error verbatim — do NOT retry, do NOT escalate to deleteInvoice. Host enforces user confirmation via the approval gate; do NOT ask the user to re-confirm before calling. |
| deleteInvoiceA | Permanently delete a draft invoice. ONLY works on status='draft'. For approved invoices, use voidInvoice (with caveats) or createInvoiceCreditNote — do NOT call deleteInvoice on approved invoices. DESTRUCTIVE: record removed permanently. ONLY call when the user explicitly says 'delete' for THIS invoice; never call as automatic recovery from another failed operation. Host enforces user confirmation via the approval gate; do NOT ask the user to re-confirm before calling. |
| createInvoiceCreditNoteB | Create a credit note against a specific invoice. The credit_note_amount is in the invoice's currency (e.g. 25 for $25). The API stores amounts in cents internally. Returns the created credit note. |
| generateInvoiceA | Generate an invoice for a single contract+customer over a billing window. Granularity is PER PHASE, NOT per product. ONE call generates ONE invoice covering ALL products active in the (contract, customer, from_date, to_date) window — every product becomes a line item on the same invoice. NEVER iterate over products. MANDATORY PRE-STEP: call Date fields accept ISO-8601 strings (e.g. Known failure modes:
• |
| listCreditNotesB | Retrieve a paginated list of credit notes. Supports cursor-based pagination. |
| getCreditNoteByIdB | Retrieve a credit note by its ID, including amount, status, customer, invoice association, and line items URL. |
| createPaymentA | Record a successful manual/offline payment or tax-withheld amount, equivalent to the frontend Add Payment flow. Link to invoices via payment_parts array. Use type='payment' with payment_method='bank_transfer', 'check', 'cash', or 'card'. Use type='tax_withheld' without payment_method. Always use status='success'. Do not use status='created' for manually recorded payments; created payments are unrealized and will not reduce invoice amount_due or mark invoices paid. The backend assigns the payment timestamp when the payment is recorded. Refunds, authorizations, reversals, payment links, and gateway charge attempts are outside this tool's scope. |
| updatePaymentB | Update a payment's invoice allocations. The API requires a non-empty request body with payment_parts. |
| deleteManualPaymentA | Permanently delete a manual payment record. Only works on payments in an eligible status for deletion. DESTRUCTIVE — only call when the user explicitly says 'delete' for THIS payment; never as automatic recovery from another failed operation. Host enforces user confirmation via the approval gate; do NOT ask the user to re-confirm before calling. |
| refundPaymentA | Refund a payment (full or partial). Pass refund_amount=0 (or full original amount) for a full refund, or a smaller positive integer for a partial refund. refund_destination + writeoff_invoices control where the refund money goes and whether linked invoices are written off. Host enforces user confirmation via the approval gate; do NOT ask the user to re-confirm before calling. |
| createInvoiceChargeB | Create an auto-charge for an invoice. Triggers payment collection via the customer's configured payment method. |
| editManualPaymentB | Edit a manual payment's details (amount, method, etc.). Uses the manual_payment-specific endpoint. |
| updateCustomerB | Update an existing customer's details. Supports partial updates — only send fields you want to change. Can update name, email, address, phone, communications_enabled, auto_charge_enabled, etc. |
| listProductsB | Retrieve a paginated list of products. Products define what is being sold and can be associated with pricing and contracts. |
| getProductByIdA | Retrieve a product by its ID, including name, SKU, description, tax codes, pricing, and custom attributes. |
| getChartOfAccountsA | Retrieve the chart of accounts for the organization, listing all account categories and their hierarchical structure. |
| listAccountsB | Retrieve a paginated list of accounting accounts (GL accounts) with optional filtering. |
| createAccountC | Create a new accounting (GL) account. |
| listJournalEntriesA | Retrieve a paginated list of journal entries with optional filtering by date, status, account, or job. Filters use fastapi-filter conventions (e.g. posted_at__gte=YYYY-MM-DD, lines__account_id=). |
| createJournalEntryB | Create a new manual journal entry with debit and credit lines. |
| getJournalEntryA | Retrieve a journal entry by its ID, including all journal lines. |
| listJournalLinesA | Retrieve a paginated list of journal lines (individual debit/credit entries) across all journal entries. Supports filtering by customer, contract, account, currency, and parent journal entry posted date. |
| getBalanceSheetB | Retrieve the balance sheet report (assets, liabilities, equity). Supports per-customer / per-contract / per-account scoping via filters and currency / cadence selection. |
| getIncomeStatementB | Retrieve the income statement (P&L) report. Supports per-customer / per-contract / per-account scoping via filters and currency / cadence selection. |
| getAccountBalanceB | Retrieve the balance for a specific accounting account. Supports filtering by customer, contract, currency, and posted-at date range. |
| createProductC | Create a new product in the catalog. |
| updateProductC | Update an existing product's details. |
| getProductPricingsB | Retrieve all pricing configurations for a specific product. |
| createProductPricingA | Create a new pricing configuration for a product. MANDATORY pre-call checklist — ask the user for ALL of these and do NOT default any silently: (1) currency (ISO 4217), (2) pricing_type (per_unit|flat_fee|tiered|volume|percent|package|step|matrix), (3) unit_amount in MAJOR currency units (float — 3 means $3, NOT 300 cents), (4) quantity object with type (fixed|metered) and unit label (e.g. 'user', 'request') and either quantity (for fixed) or aggregate_id (for metered), (5) billing_period.cadence (ISO 8601 — 'P1M' monthly, 'P3M' quarterly, 'P1Y' yearly) and billing_period.offset. SKIPPING quantity OR billing_period causes the Zenskar UI to render 'Undefined- Every Undefined Undefined' for billing cadence and 0 for billing metric — that is the #1 bug reported on this tool. |
| listPlansA | Retrieve a paginated list of plans that define reusable contract structures. Hits /plans — the same data the Zenskar app's Plans page reads. |
| getPlanByIdA | Retrieve a plan by its ID, including phases, products, and pricing configurations. |
| createPlanA | Create a new plan — a reusable contract template with phased pricing. Hits POST /plans (same Plan table the Zenskar app's PlansV2 page reads). The request body shape is NESTED, not flat: top-level fields are name, status, schedule, optional description, optional phases[]. Currency is set per-pricing inside phase.pricings[].pricing.pricing_data.currency, NOT at the top level. A plan with no phases is unusable in the UI — always include at least one phase. Plan starts as 'draft'; the user must publish it to make it active. |
| listCustomAttributesB | Retrieve a list of custom attribute definitions configured for the organization. |
| createCustomAttributeC | Create a new custom attribute definition for an entity type. |
| listTaxCategoriesB | Retrieve a list of tax categories configured for the organization. |
| createTaxCategoryC | Create a new tax category. |
| listJobsB | Retrieve a paginated list of async jobs (invoice generation, revenue recognition, etc.). |
| getJobByIdB | Retrieve a specific job by its ID to check status and results. |
| createContactB | Create a new contact associated with a customer. |
| updateContactB | Update an existing contact's details. Supports partial updates. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| zenskar-app |
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/zenskar/mcp-zenskar'
If you have feedback or need assistance with the MCP directory API, please join our Discord server