# ca.veilpoint/opportunity-exchange (remote · veilpoint.ca)

Keyless Saskatchewan labour-market data: measured wages and rents, roles, jobs, outcomes, pathways.

- Trust score: 66/100 (medium)
- Change this week: +2
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `veilpoint.ca`: 66/100 (this document), [markdown](https://verifymcp.io/servers/ca-veilpoint-opportunity-exchange/veilpoint.md), [page](https://verifymcp.io/servers/ca-veilpoint-opportunity-exchange/veilpoint)

## Channel facts

- Endpoint: `https://veilpoint.ca/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.0.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Endpoint Security**: 63/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation not fully verified: no authorisation is required to call this server, and 24 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe.
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 71/100
  - AI-judged instruction clarity (good).
  - Tool/resource definitions use about 2199 tokens (~91/item across 24 items; 24 tools + 0 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 23/100
  - Stability observed for 7 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Capabilities**: 60/100
  - Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add --transport http ca-veilpoint-opportunity-exchange https://veilpoint.ca/mcp
```

### Codex

```toml
[mcp_servers.ca-veilpoint-opportunity-exchange]
url = "https://veilpoint.ca/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "ca-veilpoint-opportunity-exchange": {
      "type": "remote",
      "url": "https://veilpoint.ca/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add ca-veilpoint-opportunity-exchange --url https://veilpoint.ca/mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  ca-veilpoint-opportunity-exchange:
    url: "https://veilpoint.ca/mcp"
```

### Other

```json
{
  "mcpServers": {
    "ca-veilpoint-opportunity-exchange": {
      "type": "http",
      "url": "https://veilpoint.ca/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 66, +1)

No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-01 (score 65, +1)

No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-31 (score 64, −2)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 66, +1)

No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-29 (score 65, +1)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “get_source_provenance” rewrote its description, which is the text the model reads
- [security] Tool “list_sectors” rewrote its description, which is the text the model reads
- [security] Tool “evaluate_pathways” rewrote its description, which is the text the model reads
- [security] Tool “get_community_economy” rewrote its description, which is the text the model reads
- [security] Tool “get_data_sources” rewrote its description, which is the text the model reads
- [security] Tool “get_economy_overview” rewrote its description, which is the text the model reads
- [security] Tool “get_sector” rewrote its description, which is the text the model reads
- [security] Tool “identify_credential_bottlenecks” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: 1830 → 2142
- [functional] New tool “get_economic_signal”
- [functional] New tool “get_emerging_signals”
- [functional] New tool “list_economic_signals”
- [cosmetic] “evaluate_pathways” added an optional parameter “householdSize”
- [cosmetic] “get_source_provenance” reworded the description of “id”

### 2026-07-28 (score 64, 0)

- [security] The server rewrote its instructions, which are the text every model session reads
- [functional regression] Schema quality: 1644 → 1830
- [functional improvement] Stability: unverified → 0.03
- [functional] New tool “get_economy_overview”
- [functional] New tool “get_community_economy”

### 2026-07-27 (score 64)

First indexed and scored.

## MCP tools (24)

### `list_roles` (~36 tokens)

The Saskatchewan occupation catalogue: id, title, NOC code, sector, hourly wage, demand score. Start here to find role ids.

### `get_role` (~52 tokens)

One occupation in full: market figures, entry requirements, working conditions, training programs, and per-community outcomes (net and discretionary monthly income at the median wage).

Input parameters:

- `id` (string, required): Role id from list_roles.

### `compare_roles` (~46 tokens)

Compare two or three roles using the shared occupation fields: wages, demand, outlook, entry requirements and work profile.

Input parameters:

- `ids` (array, required): Two or three role ids from list_roles.

### `search_jobs` (~177 tokens)

Job postings, newest first, filterable. Check meta.evidence.truthState: preview means the corpus is synthetic demonstration records. Rows with synthetic=true are preview records, never real vacancies.

Input parameters:

- `limit` (integer): Page size, 1-200 (default 50).
- `minWage` (number): Minimum hourly wage, CAD.
- `municipality` (string): Exact municipality name.
- `occupation` (string): Role id from the occupation catalogue.
- `offset` (integer): Pagination offset (default 0).
- `postedWithinDays` (integer): Only postings newer than this many days.
- `q` (string): Free-text search over title, employer and description.
- `region` (string): Exact region name.
- `sector` (string): Sector id from the sector list.
- `type` (string): Employment type.

### `compare_outcomes` (~87 tokens)

The wage-vs-cost join: what an hourly wage actually leaves over each month in every Saskatchewan community, after tax, housing, utilities and commuting. Pass occupation (models its median wage, with posting counts; their truth state is in meta.evidence) or wage.

Input parameters:

- `occupation` (string): Role id from list_roles.
- `wage` (number): Explicit hourly wage, CAD.

### `rank_communities` (~75 tokens)

Rank Saskatchewan communities by monthly discretionary income for exactly one role or explicit hourly wage.

Input parameters:

- `limit` (integer): Number of ranked communities, 1-20 (default 10).
- `occupation` (string): Role id whose median wage should be modelled.
- `wage` (number): Explicit positive hourly wage in CAD.

### `list_sectors` (~41 tokens)

Sector rollups with provider-qualified posting-corpus counts, available talent, scenario ratios, median wage and demand. Read meta.evidence before interpreting a posting count.

### `get_sector` (~37 tokens)

One sector: its occupations, provider-qualified postings by community, and notable employers.

Input parameters:

- `id` (string, required): Sector id from list_sectors.

### `identify_credential_bottlenecks` (~47 tokens)

Aggregate posting-corpus records associated with each credential against current and lapsed holders. Small cohorts are suppressed; null pressure means no holder denominator and never proves a labour deficit.

### `search_employers` (~132 tokens)

Search the public employer directory by name, municipality, sector group and its disclosed hiring flag. Preview providers return modelled hiring scenarios, not employer claims.

Input parameters:

- `hiring` (boolean): true to filter on the disclosed hiring flag; preview providers expose modelled scenarios.
- `limit` (integer): Result limit, 1-100 (default 25).
- `municipality` (string): Municipality id from /api/v1/municipalities.
- `q` (string): Case-insensitive text search over employer and sector names.
- `sector` (string): Sector-group id from /api/v1/sectors.

### `get_trade_overview` (~37 tokens)

Saskatchewan provincial exports by NAPCS section and producer grain deliveries by delivery point. Real published data (Statistics Canada, Canadian Grain Commission).

### `get_real_estate` (~75 tokens)

Housing market by community: median price, listings, market velocity, and the own-vs-rent monthly cost on the local wage. Pass municipalityId for one community with the price trend and full ownership model.

Input parameters:

- `municipalityId` (string): Municipality id (e.g. saskatoon). Omit for all communities.

### `get_wages` (~148 tokens)

Measured wages and vacancies (Statistics Canada, real data): LFS median/average hourly wages by occupation group × province, and JVWS job vacancies with average offered hourly wage by NOC 2021 unit group × province/territory. Pass noc for one unit group across geographies, province for one geography, both for one cell, neither for the national overview. Wage medians are group-level; each estimate names the published grouping that answered.

Input parameters:

- `noc` (string): Five-digit NOC 2021 unit-group code from list_noc_groups.
- `province` (string): SGC 2021 code, postal abbreviation (e.g. SK), or "canada".

### `get_rents` (~140 tokens)

Measured rental markets (CMHC Rental Market Survey via Statistics Canada, real data): average rents by unit type (bachelor to 3+ bedroom) and rental vacancy rates for every surveyed centre in Canada, October survey. Pass province for one province’s centres, centre (cmhcCode) for one centre, neither for the national overview. Suppressed cells are null and unsurveyed centres absent — never zero.

Input parameters:

- `centre` (string): CMHC/StatCan geography code (cmhcCode) from a previous get_rents call.
- `province` (string): SGC 2021 code or postal abbreviation (e.g. SK).

### `list_noc_groups` (~48 tokens)

The complete NOC 2021 occupational classification: all 516 unit groups with bilingual titles, TEER tiers, and platform coverage flags. Use to map any Canadian occupation to its code.

### `evaluate_pathways` (~365 tokens)

The decision tool: evaluate realistic routes into work for a person's stated credentials, education, experience, driver licence, relocation boundary, housing and family needs, savings, and retraining limit. Returns pass/conflict/unknown plus the same ordered, versioned evidence panel used by REST and the human evaluator. OSINT and placeholder values are excluded from ranking. Request-scoped: constraints are evaluated in-process and never stored.

Input parameters:

- `allowedMunicipalityIds` (array): Optional destination allowlist.
- `bedroomsRequired` (string): Rental unit size required by the household.
- `credentials` (array): Credential names held and current, e.g. "WHMIS", "Class 5 Licence".
- `currentMunicipalityId` (string): Current community, required when maximumRelocationKm is supplied.
- `educationLevel` (string): Highest education level.
- `experienceAreas` (array): Capability areas with real working experience.
- `householdSize` (integer): People represented by the regional Market Basket Measure basket.
- `housingBudgetMonthly` (number): Maximum monthly rent for the requested household.
- `incomeEarners` (integer): Income earners sharing housing and utilities.
- `licenceClass` (string): Highest Saskatchewan driver licence currently held.
- `limit` (number): Ranked list size (default 8, max 20).
- `maximumRelocationKm` (number): Maximum move from currentMunicipalityId; zero means local only.
- `maximumRetrainingWeeks` (number): Maximum acceptable retraining time; zero means direct entry.
- `savingsDollars` (number): Cash available for training before funding.
- `targetOccupationId` (string): Role id from list_roles — evaluates that target in depth.
- `vehicleAvailable` (boolean): Whether the scenario includes a vehicle commute.

### `list_economic_signals` (~42 tokens)

List governed Saskatchewan economic signals from official structured sources. Each row preserves lifecycle state and uncertainty; notices do not prove an award, project, hiring or outcome.

### `get_economic_signal` (~48 tokens)

Get one governed economic signal by its source-stable id, including provenance, lifecycle state, mappings and uncertainty boundaries.

Input parameters:

- `id` (string, required): Signal id from list_economic_signals.

### `get_emerging_signals` (~22 tokens)

Backward-compatible alias for list_economic_signals.

### `get_data_sources` (~41 tokens)

Read the governed upstream source registry: publisher datasets, stable source ids, licence decisions, approved and excluded uses, checked releases, materialization bindings and refresh controls.

### `get_data_providers` (~38 tokens)

Read runtime provider contracts grouped as evidence, preview, planned, first-party and derived. Only the evidence group is eligible to support factual claims.

### `get_source_provenance` (~65 tokens)

Resolve either a governed upstream source id or runtime provider id. Returns the matching source or categorized provider with its lineage; omit id for the upstream source registry.

Input parameters:

- `id` (string): Optional registered source id from get_data_sources or provider id from get_data_providers.

### `get_economy_overview` (~98 tokens)

Modeled community GDP for Saskatchewan: official provincial sector GDP (36-10-0711-01, 2022 current dollars) allocated across all 951 census subdivisions by measured activity weights, reconciling to provincial totals. Returns benchmark/allocated/residual totals, top communities, the official 2017–2025 Saskatchewan real-GDP series, and the calculation version. Community figures are structured estimates, not official measurements.

### `get_community_economy` (~104 tokens)

One community’s GDP report by 2021 SGC census subdivision code (e.g. 4708004 for Swift Current): central estimate with the income/production range and every sector’s amount and percentage share, or the suppression reason where the data cannot support a point estimate. Codes come from get_economy_overview or /api/v1/economy.

Input parameters:

- `code` (string, required): 7-digit 2021 SGC census subdivision code.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/ca-veilpoint-opportunity-exchange/veilpoint#diagnostics

## Score history

- 2026-08-03: 66
- 2026-08-02: 65
- 2026-08-01: 65
- 2026-07-31: 64
- 2026-07-30: 66
- 2026-07-29: 65
- 2026-07-28: 64
- 2026-07-27: 64

## Links

- Remote endpoint: https://veilpoint.ca/mcp
- Website: https://veilpoint.ca/agents
- Changelog RSS feed: https://verifymcp.io/servers/ca-veilpoint-opportunity-exchange/veilpoint/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/ca-veilpoint-opportunity-exchange/veilpoint/changelog.json
- HTML version of this page: https://verifymcp.io/servers/ca-veilpoint-opportunity-exchange/veilpoint
