MCP server by tatianathevisionary
💰 Wealthsimple Help Center MCP
Unofficial Model Context Protocol server that wires AI agents into the Wealthsimple Help Center — 7 typed tools for full-text search, taxonomy browsing, and article retrieval. Public Zendesk JSON API only. No scraping. No account credentials. Opt-in observability with privacy redaction.
🪙 Independent, unofficial project. This is a community-built MCP integration. It is not built, endorsed, sponsored, or maintained by Wealthsimple Technologies Inc. or @wealthsimple on GitHub. "Wealthsimple", the help center, and all article content remain the property of Wealthsimple Technologies Inc.; this server only fetches and surfaces what their public, unauthenticated Zendesk Help Center API chooses to return. For account-specific or product support, please contact Wealthsimple directly via their official channels.
💸 What it does
The Wealthsimple Help Center is the canonical source of truth for how Wealthsimple's products work — TFSA / RRSP / FHSA mechanics, transfer rules, fees, tax slips, supported countries, options trading, crypto, Cash, Trade, Invest, and more. Wiring an agent into the help center via this MCP server lets it answer Wealthsimple-related questions with cited, up-to-date, structured content rather than memorized snapshots from training data.
This MCP exposes the help center via 7 specialised tools, each with both an inputSchema and an outputSchema so MCP clients receive validated structuredContent alongside the human-readable text. Every Zendesk response is parsed through Zod schemas at the network boundary — tools never see loosely-typed data.
💡 Why it's useful
- 🪙 Cited, up-to-date answers — every article a tool returns includes its public help-center URL, so the agent can ground claims in a real source rather than guessing.
- 📈 Type-safe end-to-end — TypeScript strict mode + Zod boundary validation. A breaking change in the upstream API surfaces as a parse error, not corrupt agent context.
- 🏦 No auth, no scraping, no surprise costs — runs entirely on the public, unauthenticated Zendesk Help Center API. Zero rate limits in normal use.
- 💰 Cache-friendly by default — 30 min TTL + 256-entry LRU cache. The help center mutates slowly; cache hit rates are very high in interactive sessions.
- ⚡ Resilient client — 15 s request timeouts, up to 2 retries with exponential backoff + jitter on 408 / 425 / 429 / 5xx.
- 🔒 Opt-in observability with privacy redaction — Datadog LLM Observability built in but off by default. When on, two redaction flags let you keep latency / error / throughput signal without forwarding free-text user queries.
- 🇨🇦 Bilingual ready —
WEALTHSIMPLE_HELP_LOCALE=frswaps to the French content set. - 🧱 Boundary-clean architecture —
zendesk.tsis the only file that touches the network;telemetry.tsis the only file that importsdd-trace. Easy to reason about, easy to swap vendors.
🪙 Tools (7 total)
Every tool below ships with both inputSchema and outputSchema (Zod-validated). Clients render structuredContent alongside the human-readable text.
Search & discovery
| Tool | Purpose |
| --- | --- |
| search_help_center | Full-text search across every published article. Reach for this first. Returns ranked results with title, URL, snippet, labels, section IDs. |
| browse_taxonomy | Hierarchical view of the entire help center: categories → sections → article titles. Big payload — prefer search_help_center for targeted lookups, this one for orientation. |
Taxonomy navigation
| Tool | Purpose |
| --- | --- |
| list_categories | Top-level taxonomy: Get Started, Move Money, Investing, Spending, File Taxes, Your Profile. |
| list_sections | Sections inside a category (or all sections). |
| list_articles | Article summaries inside a single section. |
Article retrieval
| Tool | Purpose |
| --- | --- |
| get_article | Fetch a single article body by ID. Returns Markdown by default; format: "html" or "text" available. |
| resolve_help_url | Resolve a public help.wealthsimple.com article URL → full content. Useful for following user-pasted links. |
💬 Example query
Once connected, try asking your AI assistant:
"Use the wealthsimple-help-center MCP to explain how the FHSA contribution room carryover works. Search the help center for FHSA contribution rules, fetch the most relevant article in full, and cite the public URL in your answer."
Behind the scenes the agent calls search_help_center({ query: "FHSA contribution carryover" }), picks the top result, calls get_article({ article_id: <id>, format: "markdown" }), and grounds the answer in the Markdown body — with the original help.wealthsimple.com URL as the citation.
🏦 Get started
Prerequisites
- Node ≥ 20 (uses
node --env-fileand other modern features) - npm (no other package manager supported in this repo)
Quick start
git clone https://github.com/tatianathevisionary/wealthsimple-mcp.git
cd wealthsimple-mcp
npm install
npm run build
npm start # runs build/index.js on stdio
For local development with hot reload:
npm run dev # tsx watch src/index.ts
Type-check only:
npm run typecheck
Smoke test (no MCP client required)
{
printf '%s\n' \
'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"smoke","version":"0.0.0"}}}' \
'{"jsonrpc":"2.0","method":"notifications/initialized"}' \
'{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}' \
'{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"search_help_center","arguments":{"query":"TFSA contribution","limit":2}}}'
sleep 6
} | node build/index.js
You should see clean JSON-RPC over stdout, all 7 tools listed, and 2 real Wealthsimple TFSA articles returned.
Wire into an MCP host
After npm run build, point your MCP client config at the built entry script.
Claude Desktop / Cursor / VS Code (mcp.json):
{
"mcpServers": {
"wealthsimple-help-center": {
"command": "node",
"args": ["/absolute/path/to/wealthsimple-mcp/build/index.js"]
}
}
}
Claude Code:
claude mcp add wealthsimple-help-center -- node /absolute/path/to/wealthsimple-mcp/build/index.js
⚙️ Configuration
All configuration is via environment variables. Sensible defaults are provided.
Core
| Env var | Default | Description |
| --- | --- | --- |
| WEALTHSIMPLE_HELP_BASE_URL | https://help.wealthsimple.com/api/v2/help_center | Base URL for the Zendesk Help Center API. |
| WEALTHSIMPLE_HELP_LOCALE | en-ca | Locale for category / section / article queries. Set to fr for French. |
| WEALTHSIMPLE_HELP_USER_AGENT | wealthsimple-help-center-mcp/0.1 (+https://github.com/tatianathevisionary/wealthsimple-mcp; unaffiliated community project) | User-Agent header sent to the help center. Identifies traffic as this project (not Wealthsimple itself). |
| WEALTHSIMPLE_HELP_TIMEOUT_MS | 15000 | Per-request timeout in ms. |
| WEALTHSIMPLE_HELP_CACHE_TTL_MS | 1800000 (30 min) | Response cache TTL in ms. |
Optional: Datadog APM + LLM Observability
Telemetry is off by default and adds zero overhead unless explicitly enabled — dd-trace is bundled but lazy-loaded. Set either DD_API_KEY (for agentless) or WEALTHSIMPLE_HELP_TELEMETRY_ENABLED=true (when you have a local Datadog Agent) to turn it on.
🚨 Read Privacy & data tracking before turning telemetry on. When LLM Observability is enabled, this MCP captures tool inputs (including free-text search queries) and outputs and ships them to Datadog. The default (off) sends nothing. Two opt-in redaction flags (
WEALTHSIMPLE_HELP_TELEMETRY_REDACT_IO,WEALTHSIMPLE_HELP_TELEMETRY_REDACT_URLS) let you keep telemetry on without forwarding content.
| Env var | Default | Description |
| --- | --- | --- |
| WEALTHSIMPLE_HELP_TELEMETRY_ENABLED | (unset) | Set to true to initialize dd-trace (e.g. when running alongside a Datadog Agent on localhost:8126). |
| DD_API_KEY | (unset) | If set, telemetry initializes automatically (typical for agentless mode). |
| DD_SITE | datadoghq.com | Datadog site, e.g. us5.datadoghq.com, datadoghq.eu. |
| DD_SERVICE | wealthsimple-help-center-mcp | Service name shown in Datadog. |
| DD_ENV | (unset) | Environment tag, e.g. prod, staging, dev. |
| DD_VERSION | server version | Version tag for deployments. |
| DD_RUNTIME_METRICS_ENABLED | true | Set to false to disable Node runtime metrics. |
| DD_LLMOBS_ENABLED | false | Set to true to enable LLM Observability spans. Each MCP tool call produces a tool span. |
| DD_LLMOBS_ML_APP | wealthsimple-help-center-mcp | Logical app name in LLM Obs. Setting this implicitly enables LLM Obs. |
| DD_LLMOBS_AGENTLESS_ENABLED | false | Send LLM Obs spans directly to Datadog (no local Agent). Requires DD_API_KEY + DD_SITE. |
| WEALTHSIMPLE_HELP_TELEMETRY_REDACT_IO | false | Skip annotating inputData / outputData on tool spans. Span structure (name, latency, error status) is preserved; only the content is dropped. |
| WEALTHSIMPLE_HELP_TELEMETRY_REDACT_URLS | false | Strip query strings from the http.url tag on Zendesk request spans. Use alongside _REDACT_IO to remove all search-term content. |
Local development with telemetry
Copy .env.example to .env, fill in DD_API_KEY, then:
npm run start:telemetry # node --env-file=.env build/index.js
npm run dev:telemetry # tsx watch --env-file=.env src/index.ts
.env is gitignored. Do not commit it.
Wiring telemetry into an MCP host
When adding this server to a Claude Desktop / Cursor / similar MCP config, pass the env vars in the env block:
{
"mcpServers": {
"wealthsimple-help-center": {
"command": "node",
"args": ["/absolute/path/to/wealthsimple-mcp/build/index.js"],
"env": {
"DD_API_KEY": "...",
"DD_SITE": "us5.datadoghq.com",
"DD_LLMOBS_ENABLED": "true",
"DD_LLMOBS_AGENTLESS_ENABLED": "true",
"DD_LLMOBS_ML_APP": "wealthsimple-help-center-mcp"
}
}
}
}
🔒 Privacy & data tracking
When telemetry is on (and only then), this server sends data over the network to Datadog. Be deliberate about enabling it — what follows is the full inventory of what gets shipped, what does not, and how to redact further.
What is sent to Datadog (only when telemetry is on)
- Per tool call — tool name (e.g.
search_help_center), latency, success/error status. WithDD_LLMOBS_ENABLED=true, also:inputData— the full arguments the upstream agent passed in. For most tools (list_categories,list_sections,get_article,browse_taxonomy) this is just numeric/string IDs and is low-risk. Forsearch_help_centerit includes the free-text query string, which agents typically forward verbatim from a user prompt. If your user types personal information into their agent — name, email, account number, government IDs, financial details — it can end up in this field.outputData— the tool's response. Help Center articles are public content authored by Wealthsimple, so no Wealthsimple user PII flows out this way; the worst case is a verbose article body.
- Per outbound Zendesk request — full URL (including the search-term query string), HTTP status, retry count, latency.
dd-tracedefaults — Node runtime metrics (CPU, RSS memory, GC, event-loop), process info (pid, hostname), error stack traces (which include local file paths from your machine).
What is NOT sent (and structurally cannot be)
- Any Wealthsimple account data — balances, holdings, transactions, KYC info, session tokens, identity documents. This server only talks to the public, unauthenticated help center API. It has no path to user-account endpoints; Wealthsimple PII is structurally out of reach.
- Your
DD_API_KEY— used bydd-tracefor transport, never logged or serialized into spans. - The contents of
.envas a file — only the env varsdd-traceand this module explicitly read are used. - Anything from other processes on your machine — telemetry instrumentation is scoped to this server's own code.
Where the data goes
To the Datadog regional intake set in DD_SITE (e.g. us5.datadoghq.com). It is then governed by your Datadog data retention and privacy settings. Data does not flow to Wealthsimple, to this project's maintainers, or to any other third party. Wealthsimple has no visibility into your telemetry — it's a separate channel.
Mitigations available
| Knob | Effect |
| --- | --- |
| Leave telemetry off (default) | Nothing sent anywhere. |
| WEALTHSIMPLE_HELP_TELEMETRY_REDACT_IO=true | Tool spans still emit (latency, error counts, throughput preserved) but inputData and outputData are never annotated. Recommended if your agent forwards free-text from external users. |
| WEALTHSIMPLE_HELP_TELEMETRY_REDACT_URLS=true | Strips query strings from the http.url tag on Zendesk request spans. Path remains tagged for routing analysis; the search term is removed. |
| DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXP=... | Native dd-trace flag for finer-grained query-string redaction across all HTTP integrations. See the dd-trace data security docs. |
| DD_RUNTIME_METRICS_ENABLED=false | Stop emitting Node runtime metrics. Useful if you want zero machine fingerprinting. |
Recommended posture
- Solo / personal use where you control every query → enabling telemetry with full IO capture is fine and gives the best signal.
- Shared device, team, or anyone-but-you typing the queries → set
WEALTHSIMPLE_HELP_TELEMETRY_REDACT_IO=trueandWEALTHSIMPLE_HELP_TELEMETRY_REDACT_URLS=true. You still get latency, error rates, and throughput; you do not ship user content. - Production / customer-facing deployment → keep telemetry off, or run with both redaction flags plus a privacy review of
dd-trace's default capture set against your DPA / privacy policy. This project's authors have not done a formal DPIA — that is on the operator.
This server does not, and is structurally unable to, send the Wealthsimple Help Center any of its telemetry data — telemetry is a separate channel to Datadog only.
🤝 Acknowledgments
This project sits on top of work done by others — credit where due:
- Wealthsimple Technologies Inc. (@wealthsimple) — for publishing a comprehensive, well-organised help center and exposing it through a stable, public Zendesk JSON API. Every article this server returns is authored and maintained by their team. This project is grateful for their open, well-documented public API and would not exist without it.
- Anthropic and the broader Model Context Protocol community — for the protocol spec and the
@modelcontextprotocol/sdkTypeScript SDK that this server is built on. - Zendesk — for the Help Center platform whose public API this server consumes.
- Datadog — for the
dd-traceNode SDK and the LLM Observability product used for optional telemetry. - Colin McDonnell — for Zod, used at every Zendesk response boundary for runtime validation.
- damionrashford/RivalSearchMCP — for the README structure inspiration (badges row, FAQ, "give it a star" pattern). A solid example of a community-built MCP server presenting itself professionally.
❓ FAQ
Do I need a Wealthsimple account?
No. This server only talks to the public, unauthenticated Zendesk Help Center API. No Wealthsimple credentials, no OAuth, no session — there's literally no code path here that touches Wealthsimple-account data.
Do I need any API keys?
No, not for the MCP itself. The Zendesk Help Center API is unauthenticated. The only API key that matters is optional: DD_API_KEY if you want to enable Datadog telemetry. Without it, the server runs as a pure local process and dd-trace is never even loaded.
Is this an official Wealthsimple project?
No. This is an independent, community-built integration. It is not built, sponsored, endorsed, or maintained by Wealthsimple Technologies Inc. or @wealthsimple. For account-specific or product support, contact Wealthsimple directly via their official help portal.
Will my account balance / transactions / personal info be sent anywhere?
Structurally no. This MCP only fetches public help center articles. There is no code path here that can read account balances, transactions, KYC info, session tokens, or any other Wealthsimple-side personal data — the upstream API doesn't expose it and this project doesn't authenticate. The only PII risk is if your prompts to the agent include personal information that the agent then forwards verbatim into a search_help_center.query. The Privacy section above explains how to redact even that.
Does this scrape help.wealthsimple.com?
No. The server uses the public Zendesk Help Center JSON API exclusively. No HTML parsing of /hc/... pages, no headless browser, no anti-bot circumvention. If a feature requires data the Zendesk API doesn't expose, the answer will be "we won't add it" rather than "let's scrape."
What MCP clients work with this?
Any MCP-compatible client. Tested locally with Claude Desktop, Cursor, Claude Code, and VS Code MCP via stdio transport. See Wire into an MCP host for config snippets.
Why TypeScript / why Zod / why this much ceremony for a help-center search?
Because the Zendesk API's response shapes occasionally change a field, and an agent corrupting on a silent shape drift is a much worse failure mode than a parse error at the boundary. Zod's safeParse at every response converts upstream surprises into typed errors that surface in stderr instead of malformed structuredContent poisoning a tool result. The TypeScript-strict + Zod combination is doing real work, not aesthetic work.
Can I self-host / fork / change the locale?
Yes. MIT-licensed; clone freely. Set WEALTHSIMPLE_HELP_LOCALE=fr to switch to the French content set (the help center is bilingual). All other env vars are documented above.
How do I contribute?
See CONTRIBUTING.md for the dev setup, architectural rules, labelling system, and PR conventions. TL;DR: open an issue first, work on a branch, PR with Closes #N.
How do I report a bug vs. a problem with article content?
- Bug in this MCP server (schema drift, broken tool, missing feature) → open an issue on this repo.
- Problem with the content of a help center article (accuracy, product behavior, "is this still true") → contact Wealthsimple support via their official help portal. This project does not author or modify article text.
📜 License & Trademarks
MIT License © contributors. Article content fetched from the Wealthsimple Help Center is © Wealthsimple Technologies Inc. and is not covered by this license — it is surfaced via their public API for use by tools that consume this server, never redistributed or bundled.
"Wealthsimple" is a registered trademark of Wealthsimple Technologies Inc. All references in this repository are descriptive and nominative — used solely to indicate that this MCP server interfaces with Wealthsimple's public help center API. No affiliation, sponsorship, or endorsement by Wealthsimple Technologies Inc. is claimed or implied. "Datadog", "Zendesk", "Anthropic", and "Model Context Protocol" are trademarks of their respective owners.
⭐ Like this project? Give it a star!
If you find this MCP useful — for grounding agent answers in Wealthsimple's actual help center, for studying how to build a typed MCP server, for learning what opt-in privacy-aware telemetry looks like — please consider giving it a star. It helps others discover the project and motivates continued maintenance.