ca.veilpoint/opportunity-exchange
REMOTE · VEILPOINT.CA · SCANNED AUG 3
Keyless Saskatchewan labour-market data: measured wages and rents, roles, jobs, outcomes, pathways.
Available components
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. How we score →
Endpoint Security63
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- 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. See how to fix → View diagnostics → Unverified
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability71
- AI-judged instruction clarity (good).Pass
- Tool/resource definitions use about 2199 tokens (~91/item across 24 items; 24 tools + 0 resources), lean.Pass
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management23
- Stability observed for 7 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Capabilities60
- Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28. See how to fix → Fail
Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.
remote · veilpoint.ca
claude mcp add --transport http ca-veilpoint-opportunity-exchange https://veilpoint.ca/mcp
[mcp_servers.ca-veilpoint-opportunity-exchange] url = "https://veilpoint.ca/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"ca-veilpoint-opportunity-exchange": {
"type": "remote",
"url": "https://veilpoint.ca/mcp",
"enabled": true
}
}
} openclaw mcp add ca-veilpoint-opportunity-exchange --url https://veilpoint.ca/mcp --transport streamable-http
mcp_servers:
ca-veilpoint-opportunity-exchange:
url: "https://veilpoint.ca/mcp" {
"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.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 3 Aug 26 +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.
- 1 Aug 26 +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.
- 31 Jul 26 −2
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 30 Jul 26 +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.
- 29 Jul 26 +1
- 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 security
- Schema quality: 1830 → 2142 ▼ functional
- New tool “get_economic_signal” functional
- New tool “get_emerging_signals” functional
- New tool “list_economic_signals” functional
- “evaluate_pathways” added an optional parameter “householdSize” cosmetic
- “get_source_provenance” reworded the description of “id” cosmetic
- 28 Jul 26 0
- The server rewrote its instructions, which are the text every model session reads security
- Schema quality: 1644 → 1830 ▼ functional
- Stability: unverified → 0.03 ▲ functional
- New tool “get_economy_overview” functional
- New tool “get_community_economy” functional
- 27 Jul 26 64
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 3 Aug 2026 · Probed https://veilpoint.ca/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=veilpoint.ca | CN=YE2,O=Let's Encrypt,C=US | 25 Jul 2026 | 23 Oct 2026 | ECDSA 256 | ECDSA-SHA384 | 674f49e18d86df0961db13bfbdac660047e |
| SANs: veilpoint.ca | ||||||
| CN=YE2,O=Let's Encrypt,C=US (CA) | CN=Root YE,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | ECDSA 384 | ECDSA-SHA384 | 4df3b15dd6c0784c507cd37b58e6f115 |
| CN=Root YE,O=ISRG,C=US (CA) | CN=ISRG Root X2,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | ECDSA-SHA384 | 872165fc34b6e5fba8add5b3705fb53a |
| CN=ISRG Root X2,O=Internet Security Research Group,C=US (CA) | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | SHA256-RSA | 6c8f1dc727c7117f7baf853ac980f9cd |
DNSSEC insecure
Validation of veilpoint.ca. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| ca. | present | 26384 | 13 | Verified |
| veilpoint.ca. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=63072000; includeSubDomains; preload |
| content-security-policy | default-src 'self'; base-uri 'self'; object-src 'none'; frame-ancestors 'none'; form-action 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob: https:; font-src 'self' data:; connect-src 'self' https:; worker-src 'self' blob:; child-src 'self' blob:; manifest-src 'self' |
| x-content-type-options | nosniff |
| x-frame-options | DENY |
| referrer-policy | strict-origin-when-cross-origin |
| permissions-policy | camera=(), microphone=(), geolocation=(), payment=(), usb=() |
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://veilpoint.ca/mcp | Verified | 200 | |
| http (plaintext) | http://veilpoint.ca/mcp | HTTPS enforced | 301 | https://veilpoint.ca/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability.
compare_outcomes ~87
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.
| Name | Type | Req | Description |
|---|---|---|---|
| occupation | string | — | Role id from list_roles. |
| wage | number | — | Explicit hourly wage, CAD. |
No output schema declared.
No examples provided.
compare_roles ~46
Compare two or three roles using the shared occupation fields: wages, demand, outlook, entry requirements and work profile.
| Name | Type | Req | Description |
|---|---|---|---|
| ids | array | yes | Two or three role ids from list_roles. |
No output schema declared.
No examples provided.
evaluate_pathways ~365
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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. |
No output schema declared.
No examples provided.
get_community_economy ~104
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.
| Name | Type | Req | Description |
|---|---|---|---|
| code | string | yes | 7-digit 2021 SGC census subdivision code. |
No output schema declared.
No examples provided.
get_data_providers ~38
Read runtime provider contracts grouped as evidence, preview, planned, first-party and derived. Only the evidence group is eligible to support factual claims.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_data_sources ~41
Read the governed upstream source registry: publisher datasets, stable source ids, licence decisions, approved and excluded uses, checked releases, materialization bindings and refresh controls.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_economic_signal ~48
Get one governed economic signal by its source-stable id, including provenance, lifecycle state, mappings and uncertainty boundaries.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Signal id from list_economic_signals. |
No output schema declared.
No examples provided.
get_economy_overview ~98
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.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_emerging_signals ~22
Backward-compatible alias for list_economic_signals.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_real_estate ~75
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.
| Name | Type | Req | Description |
|---|---|---|---|
| municipalityId | string | — | Municipality id (e.g. saskatoon). Omit for all communities. |
No output schema declared.
No examples provided.
get_rents ~140
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.
| Name | Type | Req | Description |
|---|---|---|---|
| centre | string | — | CMHC/StatCan geography code (cmhcCode) from a previous get_rents call. |
| province | string | — | SGC 2021 code or postal abbreviation (e.g. SK). |
No output schema declared.
No examples provided.
get_role ~52
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).
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Role id from list_roles. |
No output schema declared.
No examples provided.
get_sector ~37
One sector: its occupations, provider-qualified postings by community, and notable employers.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Sector id from list_sectors. |
No output schema declared.
No examples provided.
get_source_provenance ~65
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.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | — | Optional registered source id from get_data_sources or provider id from get_data_providers. |
No output schema declared.
No examples provided.
get_trade_overview ~37
Saskatchewan provincial exports by NAPCS section and producer grain deliveries by delivery point. Real published data (Statistics Canada, Canadian Grain Commission).
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_wages ~148
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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". |
No output schema declared.
No examples provided.
identify_credential_bottlenecks ~47
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.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_economic_signals ~42
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.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_noc_groups ~48
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.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_roles ~36
The Saskatchewan occupation catalogue: id, title, NOC code, sector, hourly wage, demand score. Start here to find role ids.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_sectors ~41
Sector rollups with provider-qualified posting-corpus counts, available talent, scenario ratios, median wage and demand. Read meta.evidence before interpreting a posting count.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
rank_communities ~75
Rank Saskatchewan communities by monthly discretionary income for exactly one role or explicit hourly wage.
| Name | Type | Req | Description |
|---|---|---|---|
| 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. |
No output schema declared.
No examples provided.
search_employers ~132
Search the public employer directory by name, municipality, sector group and its disclosed hiring flag. Preview providers return modelled hiring scenarios, not employer claims.
| Name | Type | Req | Description |
|---|---|---|---|
| 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. |
No output schema declared.
No examples provided.
search_jobs ~177
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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. |
No output schema declared.
No examples provided.