@intellicompli/mcp-server
v0.2.1
Published
Official MCP server for IntelliCompli — AML/CTF compliance platform for Australian reporting entities. Connects Claude Desktop and other MCP clients to IntelliCompli's compliance APIs for KYC, sanctions screening, transaction monitoring, and AUSTRAC repor
Readme
IntelliCompli MCP Server
This package exposes IntelliCompli's AML/CTF compliance platform — customer
records, sanctions and PEP screening, transaction monitoring, alerts,
investigations, and AUSTRAC reporting — as tools an MCP (Model Context
Protocol) client such as Claude can call directly. It runs no AI itself; it
is a typed wrapper over IntelliCompli's REST API, via
@intellicompli/sdk.
Two ways to connect
1. Hosted connector (recommended)
IntelliCompli runs an MCP server at https://api.intellicompli.com.au/v1/mcp.
There is nothing to install, and authentication is OAuth 2.0 with PKCE,
handled by the MCP client — no API key to create or store.
- In the dashboard: Integrations → Claude AI
(
/dashboard/integrations/claude) shows the URL and in-app setup steps. - Public walkthrough:
/guides/claude-ai-integration. - In Claude: Settings → Integrations → Add MCP Server, paste the URL, click Connect.
The hosted connector is a separate implementation
(apps/api/src/lib/mcp/server.ts in the main repo), maintained by hand
alongside this package rather than built from it. It currently exposes
23 tools — marked "hosted" in the table below.
2. npm package (local, stdio)
Install: @intellicompli/mcp-server. Authentication is an IntelliCompli API key
(COMPLI_API_KEY), created in the dashboard. This surface exposes all
29 tools in the table below — the 23 hosted tools plus 6 npm-only ones.
The package's bin entry is named intellicompli-mcp, not
mcp-server, so a bare npx @intellicompli/mcp-server will not find it —
pass the package explicitly:
{
"mcpServers": {
"intellicompli": {
"command": "npx",
"args": ["--package=@intellicompli/mcp-server", "intellicompli-mcp"],
"env": {
"COMPLI_API_KEY": "sk_live_..."
}
}
}
}This is the format for both Claude Code's .mcp.json and Claude Desktop's
claude_desktop_config.json.
If you're developing inside this monorepo instead, build the package first
(pnpm build --filter=mcp-server from the repo root, or pnpm build from
this directory) and point at the compiled CLI directly:
{
"mcpServers": {
"intellicompli": {
"command": "node",
"args": ["packages/mcp-server/dist/cli.js"],
"env": {
"COMPLI_API_KEY": "sk_live_..."
}
}
}
}The server runs entirely over stdio: it opens no listening network port of
its own, and its only outbound traffic is HTTPS calls to the IntelliCompli
API. Requires Node.js 18 or later (the tsup build target); this isn't
enforced via an engines field in package.json.
Available tools
Tool names, parameters, and one-line summaries below are taken from the
server.tool(...) registrations in src/tools/*.ts. Hosted tool
descriptions in apps/api/src/lib/mcp/server.ts are worded slightly
differently in places since the two surfaces are maintained independently,
but the same 23 tool names and behaviour are shared.
The dashboard UI calls this domain "alerts" and "investigations," not
"cases" — the heading below keeps the API/tool name because list_cases,
get_case, etc. are literal tool names that can't be renamed here.
Customers
| Tool | Description | Availability |
|---|---|---|
| list_customers | Search and list customers by email, risk level, status, or type. Paginated. | hosted, npm |
| get_customer | Full customer profile: personal details, risk level, verification status, screening history. | hosted, npm |
| create_customer | Create a new customer record (individual or business). Write. | hosted, npm |
Screening
| Tool | Description | Availability |
|---|---|---|
| screen_sanctions | Real-time sanctions screening against DFAT, UN, and other watchlists. Write (creates a screening record). | hosted, npm |
| screen_pep | Politically Exposed Person (PEP) screening, including close associates and family. Write. | hosted, npm |
Alerts
| Tool | Description | Availability |
|---|---|---|
| list_alerts | List compliance alerts generated from monitoring, screening matches, and risk-threshold breaches. Filter by severity/status. | hosted, npm |
| get_alert | An alert's full detail: triggering event, associated customer, resolution history. | hosted, npm |
| resolve_alert | Update an alert's status, or resolve it with a disposition and notes. Write. | hosted, npm |
Cases (investigations)
| Tool | Description | Availability |
|---|---|---|
| list_cases | List investigation cases opened from high-risk alerts, screening matches, or EDD requirements. | hosted, npm |
| get_case | A case's full detail: tasks, evidence, assigned investigator, timeline. | hosted, npm |
| create_case | Open a new investigation case. Write. | hosted, npm |
| update_case | Update a case's status, priority, findings, or resolution. Write. | hosted, npm |
Transactions
| Tool | Description | Availability |
|---|---|---|
| list_transactions | List transactions; auto risk-scored and flagged for TTR at ≥ $10,000 AUD. | hosted, npm |
| get_transaction | A transaction's risk-score breakdown, TTR status, and review history. | hosted, npm |
| create_transaction | Record a transaction. Auto risk-scored, checked against TTR thresholds and structuring patterns. Accepts vendor/buyer-side counterparty fields. Write. | hosted, npm |
Risk assessment
| Tool | Description | Availability |
|---|---|---|
| assess_customer_risk | Recalculate a customer's risk level from 11+ factors (PEP, sanctions, transaction patterns, geography, industry). May trigger EDD. Write. | hosted, npm |
Reports (AUSTRAC)
| Tool | Description | Availability |
|---|---|---|
| generate_ttr | Threshold Transaction Report for cash transactions ≥ $10,000 AUD, for a date range. | hosted, npm |
| generate_ifti | International Funds Transfer Instruction report, for all international electronic transfers into/out of Australia. | hosted, npm |
No generate_smr or list_smr_reports tool exists on either surface — see
Suspicious Matter Reports
below.
Analytics
| Tool | Description | Availability |
|---|---|---|
| get_analytics | Aggregate compliance metrics for a date range: customer counts, transaction volumes, screening match rates, risk distribution, TTR/review stats. | hosted, npm |
Compliance & audit
| Tool | Description | Availability |
|---|---|---|
| list_audit_logs | The tenant's audit trail — customer changes, screening runs, case updates, report generation, API key usage. | hosted, npm |
| list_edd_investigations | Enhanced Due Diligence (EDD) investigations, auto-triggered for high-risk customers. | hosted, npm |
| get_edd_investigation | An EDD investigation's checklist, source-of-funds verification, and findings. | hosted, npm |
| list_beneficial_owners | Beneficial owners (UBOs) of a business customer — anyone with 25%+ ownership or significant control. | hosted, npm |
Client groups (npm only)
A client group is a practice client's related entities (company + trust +
individual), the parties to one property transaction (vendor, purchaser,
agent), or a legal matter's parties (client, counterparty, payer), grouped
under a groupType. These tools are read-only; linking a customer or
transaction into a group happens via client_group_id on create_customer
/ create_transaction.
| Tool | Description | Availability |
|---|---|---|
| list_client_groups | List client groups by name, type (practice/property/matter), or member customer. | npm only |
| get_client_group | A group's full detail, including every member's compliance snapshot and, for matter groups, the matter reference and status. | npm only |
Risk explanations (npm only)
| Tool | Description | Availability |
|---|---|---|
| explain_customer_risk | Plain-English narrative of why a customer is at its current risk level, for case notes or compliance review. | npm only |
| explain_transaction_risk | Plain-English narrative of why a transaction is at its current risk level. | npm only |
Integrations / agentic workflows (npm only)
| Tool | Description | Availability |
|---|---|---|
| start_matter_cdd | Kick off Customer Due Diligence on a new matter or engagement: creates the customer record and runs sanctions + PEP screening in one call. Write. | npm only |
| get_smr_context | Gather transaction, customer, and recent-alert context for a human compliance officer preparing an SMR. Does not draft or submit anything. | npm only |
Full parameter documentation (types, enums, optionality) is in the Zod
schemas in src/tools/*.ts — the tables above are names and one-line
summaries only.
Suspicious Matter Reports (SMR) and tipping-off
Flagged for legal review — see report to the team lead.
No generate_smr or list_smr_reports tool exists anywhere. Both were
removed by design: under AML/CTF Act ss123–128, disclosing the existence of
an SMR, or that one is being prepared, to a person outside a narrow set of
permitted parties is a criminal offence, and every MCP response leaves the
tenant boundary for a third-party model provider.
get_smr_context (npm package only, src/tools/integrations.ts) is not an
SMR tool. Given a transaction ID, it bundles that transaction, its
associated customer record, and up to 10 recent alerts on that customer
into one JSON response, as background material for a human compliance
officer filling in the SMR form. It never drafts, submits, or references
any existing SMR, and its response includes a fixed reminder that
submission under AML/CTF Act s41 requires the compliance officer's explicit
action.
Separately, every list/get response on both surfaces is filtered before it
reaches an MCP client: any record whose case type, resolution type, or
audit action indicates SMR activity is replaced with a redacted placeholder
rather than returned (src/sanitize.ts, mirrored in
apps/api/src/lib/mcp/sanitize.ts).
SMR preparation and submission both happen only in the dashboard, at
/dashboard/reports/smr, where the disclosure boundary is tenant ↔
IntelliCompli only.
Caching
The npm server keeps an in-memory TTL cache (src/cache.ts, LRU eviction,
periodic expiry sweep) to cut down repeat API calls within a session. Not
every tool uses it — write operations never cache their own result, and
one TTL bucket is currently unused:
| Data | TTL | Used by |
|---|---|---|
| Customers | 60s | get_customer, list_customers, list_beneficial_owners, explain_customer_risk |
| Alerts | 30s | list_alerts, get_alert |
| Cases | 30s | list_cases, get_case |
| Transactions | 30s | list_transactions, get_transaction, explain_transaction_risk, get_smr_context |
| Analytics | 120s | get_analytics |
| Audit logs | 30s | list_audit_logs |
| EDD investigations | 30s | list_edd_investigations, get_edd_investigation |
| Client groups | 60s | list_client_groups, get_client_group |
| Reports | 60s | generate_ttr, generate_ifti |
| Screening | defined, unused | none — screen_sanctions / screen_pep always run live |
Writes invalidate the read caches they affect: create_customer clears the
customer cache, resolve_alert clears the alert cache, create_case /
update_case clear the case cache, create_transaction clears the
transaction cache, and start_matter_cdd clears customer and screening
caches. assess_customer_risk has no cache to invalidate — risk.ts
doesn't read from the cache at all.
Environment variables
Both read from process.env in src/server.ts (also mirrored in
src/tools/explain.ts for its direct-fetch calls):
COMPLI_API_KEY(required) — your IntelliCompli API key. The server prints an error and exits if it's missing.COMPLI_API_URL(optional) — overrides the API base URL. Defaults tohttps://api.intellicompli.com.au/v1.
Development
From packages/mcp-server/:
pnpm build # tsup: compiles cli.ts (bundled, with the SDK inlined) and index.ts/server.ts (library build with .d.ts)
pnpm dev # tsup --watch
pnpm clean # rm -rf distThe published CLI bundle inlines @intellicompli/sdk at build time
(noExternal in tsup.config.ts), which is why @intellicompli/sdk is a
devDependency here rather than a runtime dependency — the workspace package
never needs to be resolvable at install time for someone running the
published npm package.
Publishing to npm is via the "Publish MCP Server" GitHub Actions workflow
(.github/workflows/publish-mcp.yml), which bumps the version, builds, and
runs npm publish.
Architecture
cli.ts— stdio entry point; connects the MCP server to standard input/output.server.ts— builds the SDK client and TTL cache from environment variables, then registers all 12 tool modules.cache.ts— the TTL cache implementation (LRU eviction, periodic sweep).response.ts— the one JSON-serialization path every tool should use; it routes throughsanitize.tsbefore returning.sanitize.ts— strips SMR-revealing fields and records before a response leaves the process.tools/*.ts— 12 modules (alerts,analytics,cases,client-groups,compliance,customers,explain,integrations,reports,risk,screening,transactions), one per domain.index.ts— exportscreateServer()for embedding this server in another Node process.
Example tool calls
MCP tools are called with named arguments matching their Zod schema, not CLI flags:
list_customers({ risk_level: "high", limit: 50 })
screen_sanctions({ first_name: "John", last_name: "Doe", customer_id: "cus_123" })
create_case({ title: "Suspicious transaction pattern", case_type: "transaction_review", priority: "high", customer_id: "cus_456" })
update_case({ case_id: "case_789", status: "resolved", resolution_type: "legitimate_activity", resolution_notes: "Pattern explained by seasonal business activity." })Security
- Every call is scoped to a tenant — by
COMPLI_API_KEY(npm) or the OAuth session (hosted) — with Supabase row-level security enforcing isolation server-side either way. - Every call, read or write, is recorded in the tenant's audit trail
(
list_audit_logs), visible in the dashboard. - Whether a write tool (
create_*,resolve_alert,update_case,assess_customer_risk,screen_*,start_matter_cdd) asks for confirmation before running depends on the MCP client's own permission settings, not on this server.
Version and licence
- Package version: whatever
package.jsonsays; the publish workflow bumps it and commits the bump back. Note: theMcpServeridentifies itself internally as protocol version0.1.1(src/server.ts, and separately in the hosted implementation) — this hasn't been bumped to match the last few package releases. - Licence: MIT.
