Zovo Tally Import MCP
Converts bank statements in various formats into Tally-compatible XML files for Payment, Receipt, and Contra vouchers. It handles Indian accounting formats, maps narration keywords to ledgers, and generates an Excel review sheet for verification before import.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://tally-import.zovo.one/mcpWhat its tools do
2 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
Read-only (2)
Checks and signals
Each line is separate evidence, not a trust score.
- Passed Endpoint answered the live check ·
- Availability 1 of 1 checks passed in 30 days
What you can do with it
- Convert bank statement PDFs to Tally XML
- Generate Payment, Receipt, and Contra vouchers
- Map narration keywords to specific ledgers
- Create Excel review sheets for voucher verification
Source and maintenance
Protocol and capabilities
- Server
- tally-import 1.0.0
- MCP protocol negotiated in check
- 2025-11-25
- Tools
- 2 advertised
- Resources
- 1 advertised
- Resource templates
- 1 advertised
- Prompts
- Not advertised
{
"tools": {
"listChanged": true
},
"resources": {
"listChanged": true
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
2 advertised
convert_statement_to_tally — Convert bank statement to Tally XML
Use this when the user attaches a bank statement (text PDF, CSV or Excel from net banking) and wants it as Tally XML: "bank statement to tally xml", "import bank statement in tally prime", "excel to tally". Builds Payment, Receipt and Contra vouchers against the bank ledger, maps narrations to ledgers with keyword rules (unmatched rows go to a suspense ledger), checks each voucher balances and that opening + rows = closing, and returns the vouchers XML, a ledgers XML and an Excel review sheet. Does not read scans or photos (use generate_tally_vouchers with the rows you can read), does not post into Tally, and is not for GST returns or sales invoices.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"file"
],
"properties": {
"file": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string",
"description": "ChatGPT file id, e.g. file_abc123."
},
"file_name": {
"type": "string",
"description": "Original file name if known, e.g. statement.pdf."
},
"mime_type": {
"type": "string",
"description": "Media type if known, e.g. application/pdf."
},
"download_url": {
"type": "string",
"description": "Temporary download link for the file, supplied by ChatGPT."
}
},
"description": "The bank statement to convert: a text PDF, or the CSV or Excel (.xlsx) download from net banking, e.g. hdfc-april-2026.pdf."
},
"company": {
"type": [
"string",
"number",
"null"
],
"description": "Optional Tally company name, e.g. Sharma Traders 2026-27. Leave empty to import into the company open in Tally."
},
"date_order": {
"type": [
"string",
"number",
"null"
],
"description": "Order of numeric dates: DMY (default, 02/04/2026 = 2 April) or MDY. Detected from the file when a day is above 12."
},
"auto_contra": {
"type": [
"boolean",
"string",
"null"
],
"description": "Book ATM withdrawals and cash deposits as Contra vouchers against the cash ledger. Default true."
},
"bank_ledger": {
"type": [
"string",
"number",
"null"
],
"description": "Your bank ledger name exactly as in Tally, e.g. HDFC Bank A/c. Default: Bank Account."
},
"cash_ledger": {
"type": [
"string",
"number",
"null"
],
"description": "Cash ledger for ATM withdrawals and cash deposits (booked as Contra), e.g. Cash. Default: Cash."
},
"ledger_rules": {
"anyOf": [
{
"anyOf": [
{
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"side": {
"anyOf": [
{
"type": "string",
"maxLength": 20
},
{
"type": "null"
}
],
"description": "Optional: out (withdrawals only), in (deposits only) or both (default)."
},
"group": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
],
"description": "Optional Tally group for the ledgers file, e.g. Indirect Expenses, Sundry Creditors, Bank Accounts."
},
"match": {
"type": [
"string",
"number",
"null"
],
"description": "Text to look for in the narration, case-insensitive, whole words, e.g. SALARY or AMAZON (AMAZ* matches a word start)."
},
"ledger": {
"type": [
"string",
"number",
"null"
],
"description": "Tally ledger to post matching rows to, e.g. Salary Payable."
},
"voucher_type": {
"anyOf": [
{
"type": "string",
"maxLength": 20
},
{
"type": "null"
}
],
"description": "Optional: payment, receipt or contra. Use contra for transfers to your own other bank or cash account."
}
},
"additionalProperties": {}
},
{
"type": "string",
"maxLength": 300
}
]
},
"maxItems": 200
},
{
"type": "string",
"maxLength": 8000
},
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
}
]
},
{
"type": "null"
}
],
"description": "Narration keyword to ledger rules, first match wins, e.g. [{\"match\":\"SALARY\",\"ledger\":\"Salary Payable\"},{\"match\":\"GST\",\"ledger\":\"GST Payable\"}] or text \"SALARY=Salary Payable; RENT=Rent\". Rows that match no rule go to the suspense ledger."
},
"statement_year": {
"type": [
"number",
"string",
"null"
],
"description": "Year for dates printed without one, e.g. 2026, or a financial year like \"FY 2026-27\" (April to December 2026, January to March 2027)."
},
"closing_balance": {
"type": [
"number",
"string",
"null"
],
"description": "Closing balance if the file has none, e.g. 98450.00. With the opening balance it proves no row is missing."
},
"opening_balance": {
"type": [
"number",
"string",
"null"
],
"description": "Opening balance if the file has none, e.g. 125000.50 or \"1,25,000.50 Cr\". Used to check the total."
},
"suspense_ledger": {
"type": [
"string",
"number",
"null"
],
"description": "Ledger for rows that match no rule, e.g. Suspense. Default: Suspense."
},
"bank_ledger_group": {
"type": [
"string",
"number",
"null"
],
"description": "Group of the bank ledger in the ledgers file: Bank Accounts (default) or Bank OD A/c."
},
"voucher_type_names": {
"anyOf": [
{
"type": "object",
"properties": {
"contra": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "null"
}
]
},
"payment": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "null"
}
]
},
"receipt": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "null"
}
]
}
}
},
{
"type": "null"
}
],
"description": "Only if you renamed voucher types in Tally, e.g. {\"payment\":\"Bank Payment\",\"receipt\":\"Bank Receipt\"}. Defaults: Payment, Receipt, Contra."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"source",
"bank_ledger",
"vouchers",
"totals",
"reconciliation",
"xml_check",
"financial_years",
"ledgers",
"preview",
"not_imported",
"not_imported_count",
"unread_lines",
"suspense_count",
"warnings",
"downloads",
"import_steps"
],
"properties": {
"source": {
"type": "object",
"required": [
"file",
"type"
],
"properties": {
"file": {
"type": "string"
},
"type": {
"type": "string"
}
},
"additionalProperties": false
},
"totals": {
"type": "object",
"required": [
"deposits",
"withdrawals",
"net"
],
"properties": {
"net": {
"type": "number"
},
"deposits": {
"type": "number"
},
"withdrawals": {
"type": "number"
}
},
"additionalProperties": false
},
"ledgers": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"group",
"vouchers",
"debit",
"credit"
],
"properties": {
"name": {
"type": "string"
},
"debit": {
"type": "number"
},
"group": {
"type": "string"
},
"credit": {
"type": "number"
},
"vouchers": {
"type": "number"
}
},
"additionalProperties": false
}
},
"preview": {
"type": "array",
"items": {
"type": "object",
"required": [
"row",
"date",
"type",
"ledger",
"amount",
"narration"
],
"properties": {
"row": {
"type": "number"
},
"date": {
"type": "string"
},
"type": {
"type": "string"
},
"amount": {
"type": "number"
},
"ledger": {
"type": "string"
},
"narration": {
"type": "string"
}
},
"additionalProperties": false
}
},
"vouchers": {
"type": "object",
"required": [
"total",
"payment",
"receipt",
"contra"
],
"properties": {
"total": {
"type": "number"
},
"contra": {
"type": "number"
},
"payment": {
"type": "number"
},
"receipt": {
"type": "number"
}
},
"additionalProperties": false
},
"warnings": {
"type": "array",
"items": {
"type": "string"
}
},
"downloads": {
"type": "object",
"required": [
"tally_xml",
"ledgers_xml",
"xlsx"
],
"properties": {
"xlsx": {
"type": "string"
},
"tally_xml": {
"type": "string"
},
"ledgers_xml": {
"type": "string"
}
},
"additionalProperties": false
},
"xml_check": {
"type": "string"
},
"bank_ledger": {
"type": "string"
},
"import_steps": {
"type": "string"
},
"not_imported": {
"type": "array",
"items": {
"type": "object",
"required": [
"row",
"date",
"description",
"reason"
],
"properties": {
"row": {
"type": "number"
},
"date": {
"type": "string"
},
"reason": {
"type": "string"
},
"description": {
"type": "string"
}
},
"additionalProperties": false
}
},
"unread_lines": {
"type": "number"
},
"ledgers_count": {
"type": "object",
"required": [
"shown",
"total"
],
"properties": {
"shown": {
"type": "number"
},
"total": {
"type": "number"
}
},
"additionalProperties": false
},
"preview_count": {
"type": "object",
"required": [
"shown",
"total"
],
"properties": {
"shown": {
"type": "number"
},
"total": {
"type": "number"
}
},
"additionalProperties": false
},
"reconciliation": {
"type": "object",
"required": [
"status",
"opening_balance",
"closing_balance",
"computed_closing",
"difference",
"formula"
],
"properties": {
"status": {
"enum": [
"PASS",
"DIFFERENCE",
"UNVERIFIED"
],
"type": "string"
},
"formula": {
"type": "string"
},
"difference": {
"type": [
"number",
"null"
]
},
"closing_balance": {
"type": [
"number",
"null"
]
},
"opening_balance": {
"type": [
"number",
"null"
]
},
"computed_closing": {
"type": [
"number",
"null"
]
}
},
"additionalProperties": false
},
"suspense_count": {
"type": "number"
},
"financial_years": {
"type": "array",
"items": {
"type": "string"
}
},
"not_imported_count": {
"type": "number"
}
},
"additionalProperties": false
}{
"title": "Convert bank statement to Tally XML",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}generate_tally_vouchers — Make Tally vouchers from transactions
Use this when the user wants bank statement to Tally XML from rows they pasted, typed or showed in a statement photo or table: "bank statement to tally entry", "tally xml format for bank statement". First convert what the user gave into transaction objects (date, narration, withdrawal or deposit, balance, optional ledger); pass raw pasted text in `text` only if you cannot. Returns Payment, Receipt and Contra vouchers against the bank ledger, keyword ledger rules with a suspense fallback, a balance check to the paisa, the vouchers XML, a ledgers XML and an Excel review sheet. Do not use when a statement file is attached (use convert_statement_to_tally); does not post into Tally or file GST.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"text": {
"anyOf": [
{
"type": "string",
"maxLength": 2000000
},
{
"type": "null"
}
],
"description": "Fallback only: pasted statement text or CSV when you cannot build the objects, e.g. \"02/04/2026 NEFT ACME 25,000.00 Cr 1,45,000.00\"."
},
"company": {
"type": [
"string",
"number",
"null"
],
"description": "Optional Tally company name, e.g. Sharma Traders 2026-27. Leave empty to import into the company open in Tally."
},
"date_order": {
"type": [
"string",
"number",
"null"
],
"description": "Order of numeric dates: DMY (default, 02/04/2026 = 2 April) or MDY. Detected from the file when a day is above 12."
},
"auto_contra": {
"type": [
"boolean",
"string",
"null"
],
"description": "Book ATM withdrawals and cash deposits as Contra vouchers against the cash ledger. Default true."
},
"bank_ledger": {
"type": [
"string",
"number",
"null"
],
"description": "Your bank ledger name exactly as in Tally, e.g. HDFC Bank A/c. Default: Bank Account."
},
"cash_ledger": {
"type": [
"string",
"number",
"null"
],
"description": "Cash ledger for ATM withdrawals and cash deposits (booked as Contra), e.g. Cash. Default: Cash."
},
"ledger_rules": {
"anyOf": [
{
"anyOf": [
{
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"side": {
"anyOf": [
{
"type": "string",
"maxLength": 20
},
{
"type": "null"
}
],
"description": "Optional: out (withdrawals only), in (deposits only) or both (default)."
},
"group": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
],
"description": "Optional Tally group for the ledgers file, e.g. Indirect Expenses, Sundry Creditors, Bank Accounts."
},
"match": {
"type": [
"string",
"number",
"null"
],
"description": "Text to look for in the narration, case-insensitive, whole words, e.g. SALARY or AMAZON (AMAZ* matches a word start)."
},
"ledger": {
"type": [
"string",
"number",
"null"
],
"description": "Tally ledger to post matching rows to, e.g. Salary Payable."
},
"voucher_type": {
"anyOf": [
{
"type": "string",
"maxLength": 20
},
{
"type": "null"
}
],
"description": "Optional: payment, receipt or contra. Use contra for transfers to your own other bank or cash account."
}
},
"additionalProperties": {}
},
{
"type": "string",
"maxLength": 300
}
]
},
"maxItems": 200
},
{
"type": "string",
"maxLength": 8000
},
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
}
]
},
{
"type": "null"
}
],
"description": "Narration keyword to ledger rules, first match wins, e.g. [{\"match\":\"SALARY\",\"ledger\":\"Salary Payable\"},{\"match\":\"GST\",\"ledger\":\"GST Payable\"}] or text \"SALARY=Salary Payable; RENT=Rent\". Rows that match no rule go to the suspense ledger."
},
"transactions": {
"anyOf": [
{
"anyOf": [
{
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"ref": {
"type": [
"string",
"number",
"null"
],
"description": "Cheque or reference number if shown, e.g. 000123 or UTR N1234."
},
"date": {
"type": [
"string",
"number",
"null"
],
"description": "Transaction date, e.g. 2026-04-02 or 02/04/2026 or 02-Apr-2026."
},
"amount": {
"type": [
"number",
"string",
"null"
],
"description": "Alternative to withdrawal/deposit: one signed amount (money in positive, money out negative), or an amount with Dr/Cr, e.g. \"4,500.00 Dr\"."
},
"ledger": {
"type": [
"string",
"number",
"null"
],
"description": "Optional Tally ledger for this row if the user said it, e.g. Office Rent. Overrides the rules."
},
"balance": {
"type": [
"number",
"string",
"null"
],
"description": "Running balance after the row if shown, e.g. \"1,20,500.00 Cr\"."
},
"deposit": {
"type": [
"number",
"string",
"null"
],
"description": "Deposit (credit) amount, money in, e.g. 25000. Leave empty for a withdrawal."
},
"narration": {
"type": [
"string",
"number",
"null"
],
"description": "Narration or description as printed, e.g. NEFT-ACME TRADERS-INV 114."
},
"withdrawal": {
"type": [
"number",
"string",
"null"
],
"description": "Withdrawal (debit) amount, money out, e.g. 4500 or \"1,25,000.00\". Leave empty for a deposit."
},
"voucher_type": {
"type": [
"string",
"number",
"null"
],
"description": "Optional: payment, receipt or contra for this row."
}
},
"additionalProperties": {}
},
{
"type": "array",
"items": {
"type": [
"string",
"number",
"null"
]
}
},
{
"type": "string"
}
]
},
"maxItems": 20001
},
{
"type": "string",
"maxLength": 2000000
}
]
},
{
"type": "null"
}
],
"description": "The bank rows as objects in statement order, e.g. [{\"date\":\"02/04/2026\",\"narration\":\"NEFT-ACME TRADERS\",\"deposit\":\"25,000.00\"},{\"date\":\"03/04/2026\",\"narration\":\"ATM WDL MG ROAD\",\"withdrawal\":5000}]. Pasted statement text is also accepted."
},
"statement_year": {
"type": [
"number",
"string",
"null"
],
"description": "Year for dates printed without one, e.g. 2026, or a financial year like \"FY 2026-27\" (April to December 2026, January to March 2027)."
},
"closing_balance": {
"type": [
"number",
"string",
"null"
],
"description": "Closing balance if the file has none, e.g. 98450.00. With the opening balance it proves no row is missing."
},
"opening_balance": {
"type": [
"number",
"string",
"null"
],
"description": "Opening balance if the file has none, e.g. 125000.50 or \"1,25,000.50 Cr\". Used to check the total."
},
"suspense_ledger": {
"type": [
"string",
"number",
"null"
],
"description": "Ledger for rows that match no rule, e.g. Suspense. Default: Suspense."
},
"bank_ledger_group": {
"type": [
"string",
"number",
"null"
],
"description": "Group of the bank ledger in the ledgers file: Bank Accounts (default) or Bank OD A/c."
},
"voucher_type_names": {
"anyOf": [
{
"type": "object",
"properties": {
"contra": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "null"
}
]
},
"payment": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "null"
}
]
},
"receipt": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "null"
}
]
}
}
},
{
"type": "null"
}
],
"description": "Only if you renamed voucher types in Tally, e.g. {\"payment\":\"Bank Payment\",\"receipt\":\"Bank Receipt\"}. Defaults: Payment, Receipt, Contra."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"source",
"bank_ledger",
"vouchers",
"totals",
"reconciliation",
"xml_check",
"financial_years",
"ledgers",
"preview",
"not_imported",
"not_imported_count",
"unread_lines",
"suspense_count",
"warnings",
"downloads",
"import_steps"
],
"properties": {
"source": {
"type": "object",
"required": [
"file",
"type"
],
"properties": {
"file": {
"type": "string"
},
"type": {
"type": "string"
}
},
"additionalProperties": false
},
"totals": {
"type": "object",
"required": [
"deposits",
"withdrawals",
"net"
],
"properties": {
"net": {
"type": "number"
},
"deposits": {
"type": "number"
},
"withdrawals": {
"type": "number"
}
},
"additionalProperties": false
},
"ledgers": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"group",
"vouchers",
"debit",
"credit"
],
"properties": {
"name": {
"type": "string"
},
"debit": {
"type": "number"
},
"group": {
"type": "string"
},
"credit": {
"type": "number"
},
"vouchers": {
"type": "number"
}
},
"additionalProperties": false
}
},
"preview": {
"type": "array",
"items": {
"type": "object",
"required": [
"row",
"date",
"type",
"ledger",
"amount",
"narration"
],
"properties": {
"row": {
"type": "number"
},
"date": {
"type": "string"
},
"type": {
"type": "string"
},
"amount": {
"type": "number"
},
"ledger": {
"type": "string"
},
"narration": {
"type": "string"
}
},
"additionalProperties": false
}
},
"vouchers": {
"type": "object",
"required": [
"total",
"payment",
"receipt",
"contra"
],
"properties": {
"total": {
"type": "number"
},
"contra": {
"type": "number"
},
"payment": {
"type": "number"
},
"receipt": {
"type": "number"
}
},
"additionalProperties": false
},
"warnings": {
"type": "array",
"items": {
"type": "string"
}
},
"downloads": {
"type": "object",
"required": [
"tally_xml",
"ledgers_xml",
"xlsx"
],
"properties": {
"xlsx": {
"type": "string"
},
"tally_xml": {
"type": "string"
},
"ledgers_xml": {
"type": "string"
}
},
"additionalProperties": false
},
"xml_check": {
"type": "string"
},
"bank_ledger": {
"type": "string"
},
"import_steps": {
"type": "string"
},
"not_imported": {
"type": "array",
"items": {
"type": "object",
"required": [
"row",
"date",
"description",
"reason"
],
"properties": {
"row": {
"type": "number"
},
"date": {
"type": "string"
},
"reason": {
"type": "string"
},
"description": {
"type": "string"
}
},
"additionalProperties": false
}
},
"unread_lines": {
"type": "number"
},
"ledgers_count": {
"type": "object",
"required": [
"shown",
"total"
],
"properties": {
"shown": {
"type": "number"
},
"total": {
"type": "number"
}
},
"additionalProperties": false
},
"preview_count": {
"type": "object",
"required": [
"shown",
"total"
],
"properties": {
"shown": {
"type": "number"
},
"total": {
"type": "number"
}
},
"additionalProperties": false
},
"reconciliation": {
"type": "object",
"required": [
"status",
"opening_balance",
"closing_balance",
"computed_closing",
"difference",
"formula"
],
"properties": {
"status": {
"enum": [
"PASS",
"DIFFERENCE",
"UNVERIFIED"
],
"type": "string"
},
"formula": {
"type": "string"
},
"difference": {
"type": [
"number",
"null"
]
},
"closing_balance": {
"type": [
"number",
"null"
]
},
"opening_balance": {
"type": [
"number",
"null"
]
},
"computed_closing": {
"type": [
"number",
"null"
]
}
},
"additionalProperties": false
},
"suspense_count": {
"type": "number"
},
"financial_years": {
"type": "array",
"items": {
"type": "string"
}
},
"not_imported_count": {
"type": "number"
}
},
"additionalProperties": false
}{
"title": "Make Tally vouchers from transactions",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}Prompts
Not advertised
Resources
1 advertised
tally-import-widget — Zovo Tally Import view
Interactive view for Zovo Tally Import.
ui://widget/tally-import-v1-1.0.0-3ec88f3bd8802a71667a1c78e5eaeb26a80b1aee786811f0f9bcdceb88eab693.htmltally-import-widget-legacy — Zovo Tally Import view (previous versions)
ui://widget/tally-import-{version}.html30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 506 ms
- 95th percentile latency
- 506 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 506 ms · metadata changed · 2 tool(s), 1 resource(s), 1 resource template(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http zovo-tally-import-mcp https://tally-import.zovo.one/mcpCodex
codex mcp add zovo-tally-import-mcp --url https://tally-import.zovo.one/mcpCursor
{
"mcpServers": {
"zovo-tally-import-mcp": {
"url": "https://tally-import.zovo.one/mcp"
}
}
}Cline
{
"mcpServers": {
"zovo-tally-import-mcp": {
"type": "streamableHttp",
"url": "https://tally-import.zovo.one/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"zovo-tally-import-mcp": {
"type": "http",
"url": "https://tally-import.zovo.one/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http zovo-tally-import-mcp https://tally-import.zovo.one/mcpClaude Desktop
https://tally-import.zovo.one/mcpWindsurf
{
"mcpServers": {
"zovo-tally-import-mcp": {
"serverUrl": "https://tally-import.zovo.one/mcp"
}
}
}Let your agent find its tools
Find servers like Zovo Tally Import MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.