smart-npv-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@smart-npv-mcpShow me the status of the Cohen file."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
smart-npv-mcp
An MCP server that turns the Smart NPV mortgage-advisor CRM into tools your AI agent can call.
שרת MCP שמחבר סוכני AI (Claude, Cursor, Hermes ועוד) ישירות למערכת Smart NPV, כדי לקרוא ולעדכן תיקי לקוחות, סטטוסים, מסמכים וסימולציות בשפה טבעית.
Built at BeAi. Works with any Smart NPV account.
⚠️ Community project. Not affiliated with or endorsed by Smart NPV. Built against their public API documentation.
Table of contents
Related MCP server: AI-Assisted CRM MCP Server
What is this?
Three pieces come together here:
Smart NPV is a CRM built for Israeli mortgage advisors: it manages client files, mortgage calculations, document checklists, and workflow stages. It exposes a REST API (behind a paid tier).
MCP (Model Context Protocol) is an open standard that lets AI agents call external tools through a uniform interface. Instead of hand-writing HTTP requests, an agent gets a clean, typed set of tools it can reason about and call.
This server is the bridge. It wraps every documented Smart NPV endpoint as an MCP tool, so any MCP-capable agent can operate the CRM: list clients, read a client's status and documents, add a status, upload a file, record a payment, run simulations, and more.
In one sentence: it lets an AI agent operate Smart NPV for you, safely and deterministically, instead of clicking through the UI.
Why would I want it?
A mortgage advisor working solo juggles dozens of active files, each moving through an 8-stage workflow that can take months. Files fall through the cracks. An AI agent connected through this server can, for example:
Watch the pipeline. Every morning, list all active clients, read each one's status and predicted stage date, and flag the ones that have stalled: "3 files are past their stage deadline. Client X has had no movement for 12 days."
Chase missing documents. Read a client's document list, compare against the required checklist, and draft a reminder for exactly what is missing.
Keep the CRM tidy. Record a status change or file an uploaded document back into the right client, automatically.
Answer questions. "How many leads came in this month?" "What is the status of the Cohen file?"
The agent decides what to do; this server gives it the hands to do it in Smart NPV.
How it works
flowchart LR
A["AI agent<br/>(Claude / Cursor / Hermes)"] -- "MCP (stdio)" --> B["smart-npv-mcp<br/>server"]
B -- "HTTPS + api_key" --> C["Smart NPV API<br/>www.snpv.co.il"]
C -- "JSON" --> B
B -- "tool result" --> AThe agent speaks MCP over stdio. This server translates each tool call into the correct Smart NPV HTTP request (injecting your api_key), and returns the JSON response back to the agent.
Requirements
Node.js 18+ (uses the built-in
fetch,FormData, andBlob).A Smart NPV account with API access. The API sits behind Smart NPV's extended (paid) subscription. You will need an API key from them. Some tools also require the Premium tier (marked below).
Installation
Option A: via npx (recommended, once published to npm)
No install needed; your MCP client runs it on demand:
npx -y smart-npv-mcpOption B: from source
git clone https://github.com/binyaminboukaya/smart-npv-mcp.git
cd smart-npv-mcp
npm install
npm run buildConfiguration
The server reads four environment variables:
Variable | Required | Default | Notes |
| for API calls | (none) | Your key from the extended subscription. The server still starts and lists its tools without it, but every call will error until it is set. |
| no |
| The API host. Must be |
| no |
| Per-request timeout in milliseconds. |
| no, recommended | (unrestricted) | Confines the three upload tools to files inside this directory. Without it, any |
For local development, copy the template:
cp .env.example .env
# then edit .env and paste your keyHow to get a key: contact Smart NPV support / your account manager and ask to enable API access on the extended subscription. They issue the
api_key.
Connecting to an MCP client
Add an entry to your client's MCP config. The examples below assume the key is in SMARTNPV_API_KEY.
{
"mcpServers": {
"smart-npv": {
"command": "npx",
"args": ["-y", "smart-npv-mcp"],
"env": { "SMARTNPV_API_KEY": "your-key-here" }
}
}
}{
"mcpServers": {
"smart-npv": {
"command": "npx",
"args": ["-y", "smart-npv-mcp"],
"env": { "SMARTNPV_API_KEY": "your-key-here" }
}
}
}{
"mcpServers": {
"smart-npv": {
"command": "node",
"args": ["/absolute/path/to/smart-npv-mcp/dist/index.js"],
"env": {
"SMARTNPV_BASE_URL": "https://www.snpv.co.il",
"SMARTNPV_API_KEY": "your-key-here"
}
}
}
}After adding the config, restart the client. You should see the smart-npv tools appear.
The authentication model
Smart NPV passes the api_key differently depending on the request type. This server handles it for you automatically; you never pass api_key as a tool argument.
Request type | Where |
| query parameter |
| field in the JSON body |
Upload tools | multipart form field |
Tool reference (32 tools)
Legend: Premium = requires the Premium tier of the subscription. Required arguments are in bold.
Working with client data? See docs/client-fields.md for the full client field schema — including the
_1/_2two-borrower model that every personal field uses.
Tool | Arguments | What it does |
|
| List clients or leads, paged and date-filtered. |
|
| Fetch one client by uuid or phone. |
|
| List the documents attached to a client. |
|
| Create a client (fields inside |
|
| Update a client. |
|
| Delete a client (irreversible). |
|
| Add a documentation record. |
|
| Upload a PDF/PNG/JPG file to a client. |
Tool | Arguments | What it does |
|
| Current status/stage of a client. Core for pipeline monitoring. |
| (none) | The status/stage definitions in the account. |
|
| Add/set a status on a client. |
Tool | Arguments | What it does |
|
| List a client's mortgage simulations. |
|
| Fetch a specific simulation. |
|
| Add a mortgage mix. |
|
| Delete a simulation. |
|
| Run the reform/recalculation engine. |
Tool | Arguments | What it does |
|
| List a client's payments. |
|
| Record a payment (e.g. a retainer). |
|
| Update a payment. |
Tool | Arguments | What it does |
| (none) | List contact groups. |
| (none) | List contacts (bankers, appraisers, etc.). |
|
| Add a contact. |
|
| Add a contact group. |
Tool | Arguments | What it does |
|
| Create a product. |
| (none) | List lead sources / networks. |
|
| Add a lead source. |
|
| Update a lead source. |
|
| Upload a bank balance-report PDF for parsing. |
| (none) | Banks supported by the balance-report service. |
|
| Is a bank supported by the service. |
|
| Upload an approval-in-principle PDF for scanning. |
| (none) | Reference list of cities. |
Worked example: a pipeline guardian
The most valuable pattern. Goal: every morning, surface files that have stalled.
What you say to the agent:
"Go over all my active clients and tell me which ones have not moved recently or are past their stage deadline."
What the agent does with these tools:
list_clientswithlead: falseto get active files.For each client,
get_client_statusto read the current stage and its predicted date.Compares dates, and reports the stalled ones back to you in plain language.
What you get back:
"3 files need attention: Levi (stage 2, 11 days no movement), Cohen (past the appraisal deadline by 4 days), Mizrahi (documents requested 8 days ago, none received)."
Then, still in the same conversation:
"Draft a WhatsApp reminder to Mizrahi for the missing documents."
The agent uses get_client_documentations to see what is missing and drafts the message. You approve and send. No file falls through the cracks.
Example calls and responses
Tool arguments are plain JSON. A few illustrative calls (exact response shape depends on your Smart NPV account, since this is built against the documented API):
List the 25 most recent active clients
// tool: list_clients
{ "limit": 25, "offset": 0, "lead": false }Read one client's status
// tool: get_client_status
{ "uuid": "12345678-1234-1234-1234-123456789109" }Add a status to a client
// tool: add_status
{ "params": { "uuid": "12345678-...", "status_id": 4, "note": "Documents received" } }Upload a document
// tool: upload_document
{
"uuid": "12345678-...",
"file_name": "tabu_nispach.pdf",
"file_path": "/Users/me/Downloads/tabu_nispach.pdf"
}Record a retainer payment
// tool: add_payment
{ "uuid": "12345678-...", "params": { "amount": 2000, "type": "retainer" } }A successful call returns the API's JSON as text. On failure the result is marked as an error (see below).
Note on
params: several write endpoints accept a free-formparamsobject whose exact inner fields are defined by Smart NPV and are not fully published. Pass the fields the CRM expects. Once you have a live key, inspect a real record (e.g.get_client) to learn the field names.
Error handling
Every tool catches failures and returns an MCP error result rather than crashing the server:
Error: Smart NPV /api/v2/clients/get_client_status -> HTTP 401: {"message":"invalid api_key"}Common cases:
Key missing:
SMARTNPV_API_KEY is not set.Auth failure: HTTP 401/403 (bad or unauthorized key, or a Premium tool on a non-Premium plan).
Bad arguments: the API returns a 4xx with a message; it is surfaced verbatim.
Troubleshooting
Symptom | Likely cause / fix |
Every call returns "api_key is not set" |
|
401 / 403 on every call | Wrong key, or API access not enabled on your subscription. |
404 on all calls | Wrong base URL. Ensure it is |
A specific tool 403s | It is a Premium tool and your plan is not Premium. |
Tools do not appear in the client | Restart the client after editing the config; check the command/path is correct. |
Upload fails | Ensure |
Development
npm install
npm run dev # run from source with tsx (no build)
npm run build # compile TypeScript to dist/
npm run typecheck # type-check only
npm start # run the built serverProject layout:
src/
index.ts MCP server: registers every tool, wires stdio transport
endpoints.ts the 32 endpoint definitions (path, method, zod input schema)
client.ts HTTP client: GET (query), POST (json body), multipart uploadAdding a tool is one entry in endpoints.ts. The server registers it automatically.
Quick smoke test (lists tools over the MCP protocol):
printf '%s\n' \
'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"t","version":"0"}}}' \
'{"jsonrpc":"2.0","method":"notifications/initialized"}' \
'{"jsonrpc":"2.0","id":2,"method":"tools/list"}' \
| SMARTNPV_API_KEY=test node dist/index.jsProject status and roadmap
✅ All 32 documented endpoints wrapped as tools.
✅ Type-checks, builds, and passes an MCP
tools/listsmoke test.⏳ Not yet live-tested against a real account (needs an API key). Until then, treat response shapes as indicative.
🔜 Tighten the free-form
paramsschemas once real field names are confirmed against a live key.🔜 Optional: publish to npm so
npx smart-npv-mcpworks with no clone.
Contributing
Issues and pull requests welcome. Good first contributions: confirming real field names for the params payloads, adding response examples from a live account, or improving tool descriptions.
License
MIT © 2026 Binyamin Boukaya (BeAi).
Smart NPV is a trademark of its respective owner. This is an independent, unofficial integration.
Available Tools
32 toolsadd_contactAdd contactC
Add a contact. Fields go inside params.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes | Object of fields passed to Smart NPV as documented in its API. |
add_contact_groupAdd contact groupC
Add a contact group. Fields go inside params.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes | Object of fields passed to Smart NPV as documented in its API. |
add_documentationAdd documentation entryC
Add a documentation record to a client.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | ||
| params | Yes | Object of fields passed to Smart NPV as documented in its API. |
add_paymentAdd paymentB
Record a payment on a client (e.g. retainer / installment).
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | ||
| params | No | Object of fields passed to Smart NPV as documented in its API. |
add_simulationAdd simulationC
Add a mortgage simulation (mix) to a client.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | ||
| uuid | Yes | ||
| mixes | No | ||
| current_mix | No | ||
| simulation_name | Yes | ||
| current_mix_toolbar | No |
add_sourceAdd lead sourceB
[Premium] Add a main lead source. Fields go inside params.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes | Object of fields passed to Smart NPV as documented in its API. |
add_statusAdd / set statusC
Add or set a status on a client. Fields go inside params.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes | Object of fields passed to Smart NPV as documented in its API. |
approval_in_principle_scanningScan an approval-in-principle (PDF)C
[Premium] Upload a bank approval-in-principle document for scanning.
| Name | Required | Description | Default |
|---|---|---|---|
| bank_id | Yes | ||
| file_path | Yes | Local path to the approval-in-principle PDF |
balance_report_parsingParse a bank balance report (PDF)C
[Premium] Upload a bank balance report PDF for parsing.
| Name | Required | Description | Default |
|---|---|---|---|
| bank_id | Yes | ||
| file_path | Yes | Local path to the balance report PDF |
calc_simulationCalculate simulationB
[Premium] Run the reform/recalculation engine on a request payload.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes | The calculation request payload |
check_bank_availabilityCheck bank availabilityBRead-only
[Premium] Check whether the balance-report service supports a given bank.
| Name | Required | Description | Default |
|---|---|---|---|
| bank_id | Yes |
create_clientCreate clientA
Create a new client. Fields go inside params, using the _1/_2 borrower field names from docs/client-fields.md (e.g. firstname_1, phone_1, income_1).
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes | Object of fields passed to Smart NPV as documented in its API. |
create_productCreate productC
Create a product. Fields go inside params. Note: this path (with capital-P 'Products') comes from the vendor docs but has not been verified against the live API yet — confirm with Smart NPV before relying on it.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes | Object of fields passed to Smart NPV as documented in its API. |
delete_clientDelete clientADestructive
Delete a client by uuid. Irreversible.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes |
delete_simulationDelete simulationADestructive
Delete a simulation. Note: this path (singular 'simulation', not under clients/) comes from the vendor docs but has not been verified against the live API yet — confirm with Smart NPV before relying on it.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Simulation uuid (or client uuid + simulation ref in params) |
get_banksGet banksARead-only
[Premium] List banks supported by the balance-report service.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
get_citiesGet citiesARead-only
Reference list of cities.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
get_clientGet clientARead-only
Fetch a single client by uuid or phone. Returns the full record under 'responseClientFields', including both borrowers (_1/_2), employment, income, contract amounts and the last note. See docs/client-fields.md.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Lookup key | |
| uuid | No | ||
| phone | No |
get_client_documentationsGet client documents listARead-only
List the documents attached to a client (what has been uploaded).
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Client uuid |
get_client_simulationsGet client simulationsBRead-only
List a client's mortgage simulations.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes |
get_client_statusGet client statusARead-only
Get the current status/stage of a client. Key for pipeline monitoring.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes |
get_contact_groupsGet contact groupsARead-only
List contact groups.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
get_contactsGet contactsARead-only
List contacts (e.g. bankers, appraisers).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
get_paymentsGet client paymentsARead-only
List a client's payments.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes |
get_simulationGet simulationBRead-only
Fetch a specific simulation for a client.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | ||
| simulation_uuid | No | Specific simulation id, if required |
get_sourcesGet lead sourcesARead-only
[Premium] List main lead sources (networks).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
get_status_listGet status listARead-only
List the status/stage definitions available in the account.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
list_clientsList clientsARead-only
List clients / leads. Supports paging (limit/offset) and a date range. Prefer a small limit (e.g. 25) — the unfiltered list can be very large. A client is a mortgage case with up to two borrowers: personal fields are suffixed _1 (primary) and _2 (co-applicant). Rows are under 'responseClients'. See docs/client-fields.md for the full field schema.
| Name | Required | Description | Default |
|---|---|---|---|
| from | No | From date, DD/MM/YYYY | |
| lead | No | true = leads only, false = clients | |
| limit | No | Page size, e.g. 25 | |
| until | No | Until date, DD/MM/YYYY | |
| offset | No | Page offset | |
| reference | No | ||
| range_type | No | Date range type (1/2) |
update_clientUpdate clientADestructive
Update an existing client by uuid. Fields go inside params, using the _1/_2 borrower field names from docs/client-fields.md.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | ||
| params | No | Object of fields passed to Smart NPV as documented in its API. |
update_paymentUpdate paymentBDestructive
Update an existing payment by payment_uuid.
| Name | Required | Description | Default |
|---|---|---|---|
| params | No | Object of fields passed to Smart NPV as documented in its API. | |
| payment_uuid | Yes |
update_sourceUpdate lead sourceADestructive
[Premium] Update a main lead source. Fields go inside params.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes | Object of fields passed to Smart NPV as documented in its API. |
upload_documentUpload a document fileC
Upload a document file (PDF/PNG/JPG/JPEG) to a client.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | ||
| file_name | Yes | Display name to store the file under | |
| file_path | Yes | Local path to the file to upload |
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
32 tool updates
v0.2.0- First observed
add_contact - First observed
add_contact_group - First observed
add_documentation - First observed
add_payment - First observed
add_simulation - First observed
add_source - First observed
add_status - First observed
approval_in_principle_scanning - First observed
balance_report_parsing - First observed
calc_simulation - First observed
check_bank_availability - First observed
create_client - First observed
create_product - First observed
delete_client - First observed
delete_simulation - First observed
get_banks - First observed
get_cities - First observed
get_client - First observed
get_client_documentations - First observed
get_client_simulations - First observed
get_client_status - First observed
get_contact_groups - First observed
get_contacts - First observed
get_payments - First observed
get_simulation - First observed
get_sources - First observed
get_status_list - First observed
list_clients - First observed
update_client - First observed
update_payment - First observed
update_source - First observed
upload_document
TDQS
Scored across 32 tools
Most tools target distinct resources and actions (clients, payments, simulations, contacts). A few document-related tools (upload_document, add_documentation, balance_report_parsing, approval_in_principle_scanning) could cause confusion, but descriptions clarify their specific purposes.
The set uses a mix of get_/list_/check_ and noun-based names (balance_report_parsing), plus add_/update_/create_/delete_. While readable, there is no single consistent verb_noun pattern (e.g., list_clients vs get_banks, check_bank_availability vs get_banks).
32 tools is heavy, exceeding the typical well-scoped range for an MCP server. The server covers many subdomains, but the count feels bloated and detracts from coherence.
Core client lifecycle is covered (CRUD, status, payments, simulations), but there are gaps: no delete_source, no contact update/delete, no payment delete, and some endpoints are unverified. These gaps might force workarounds but do not break the main workflows.
Maintenance
Related MCP Connectors
Build and run AI voice agents for phone calls: agents, numbers, campaigns, calls. Hebrew, English.
Real estate agency CRM: listings, clients, leads and viewings from your AI assistant (OAuth).
Manage SalesCloser AI sales agents, leads, campaigns and calls from your AI assistant.
Operate the Plixana CRM from any AI: contacts, deals, quotes, WhatsApp and metrics.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables AI assistants to answer mortgage-related queries by providing tools for lender search, loan limit lookup, down-payment assistance programs, and more, with data sourced from real wholesale lenders and broker-curated intel.85 npmMIT
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to perform CRM operations like creating contacts, managing deals, and updating leads through natural language using the Model Context Protocol.4-
- AlicenseBqualityDmaintenanceEnables AI assistants to manage CRM deals and tasks on Aspro Cloud, including CRUD operations on deals, tasks, users, pipelines, and workflows.16MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to interact with amoCRM, providing access to deals, contacts, companies, notes, tasks, and custom fields via natural language.8 npmMIT