ca.veilpoint/opportunity-exchange
Keyless Saskatchewan labour-market data: measured wages and rents, roles, jobs, outcomes, pathways.The vendor's description, from its MCP Registry listing.
- Warning: 72 of 72 tools do not say whether they can change things.
Nothing failed, but there is something to know or fix. Public audit: we connect as an AI client would, list the tools and check what they say. We do not run them. How we audit
- Does it work?
- YesConnected in 256 ms.
- Sign-up?
- None neededIt answered without any account or key.
- Can it change things?
- Doesn't sayIts tools do not say whether they only read, so treat them as able to change things.
https://veilpoint.ca/mcpWebsite Streamable HTTP · protocol 2025-06-18 · server version 1.0.0
What we checked
Security
Passed: Connections are encrypted (HTTPS).
Passed: No hidden instructions found in tool text.
Safety labels
Warning: 72 of 72 tools do not say whether they can change things.
MCP lets a server label each tool as read-only or destructive, so clients can ask the user before risky calls. Unlabelled tools are treated as able to change things.
- investigate_economic_question
- inspect_knowledge_frontier
- resolve_entities
- get_entity_context
- query_knowledge_graph
- get_knowledge_graph_status
- compare_municipalities
- list_roles
- and 64 more
Tools
Note: Some tool text is long, so it uses more of the AI's working memory.
- server instructions (4,434 characters)
Passed: 72 tools listed.
Passed: Every tool describes its inputs with a valid schema.
Protocol
Note: Protocol version 2025-06-18.
Passed: The MCP handshake works (Streamable HTTP).
Passed: Unknown requests are refused.
Connection
Passed: The server responds.
Tools (72)
As the server describes them. The labels are the server's own: it says whether each tool only reads or can change things.
- investigate_economic_questionTurn a natural-language economic question into an inspectable deterministic plan, resolve governed entities, execute a bounded set of existing OEX graph/data primitives, and return a citation-ready e…Doesn't say
- inspect_knowledge_frontierWhat OEX has asked about a subject, what it could not conclude, why, and which registered question logically follows. Governed and deterministic: every field is a typed governed value or a fixed cata…Doesn't say
- resolve_entitiesResolve a user-supplied name, slug, NOC code, SGC code, program, sector or governed source to its canonical OEX identity. Call this before joining datasets when the identifier is uncertain. Results i…Doesn't say
- get_entity_contextFetch the governed context for one resolved entity in a single call. Accepts a canonical id, local slug or exact name and routes to the existing occupation, municipality, sector, training, NOC or sou…Doesn't say
- query_knowledge_graphQuery the materialized semantic graph without downloading whole datasets. Resolve an entity name/code and optional municipality geography, then return typed facts and relationships. This supports mun…Doesn't say
- get_knowledge_graph_statusReturn the current database graph inventory by entity type, predicate and metric plus deterministic core reconciliation. ok=true means every governed core entity, alias, edge and fact is present; add…Doesn't say
- compare_municipalitiesCompare 2–10 exact Saskatchewan municipalities using the newest governed fact for each standard economic metric. A metric is comparable only when all resolved municipalities have the same unit and re…Doesn't say
- list_rolesThe Saskatchewan occupation catalogue: id, title, NOC code, sector, hourly wage, demand score. Start here to find role ids.Doesn't say
- get_roleOne occupation in full: market figures, entry requirements, working conditions, training programs, and per-community outcomes (net and discretionary monthly income at the median wage).Doesn't say
- compare_rolesCompare two or three roles using the shared occupation fields: wages, demand, outlook, entry requirements and work profile.Doesn't say
- search_hiring_activitySource-attributed hiring-activity evidence, newest first and filterable by occupation, sector and geography. data.recordPurpose and each row recordPurpose are hiring_activity_evidence; rows are obser…Doesn't say
- compare_outcomesThe 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…Doesn't say
- rank_communitiesRank Saskatchewan communities by monthly discretionary income for exactly one role or explicit hourly wage.Doesn't say
- list_sectorsSector rollups with provider-qualified hiring-record counts, median wage and occupation demand. Candidate profiles are excluded. Read meta.evidence before interpreting a count.Doesn't say
- get_sectorOne sector: its occupations, provider-qualified postings by community, and notable employers.Doesn't say
- summarize_credential_demandAggregate hiring records associated with occupational credential requirements. Candidate profiles and holder counts are excluded; the result describes demand evidence, not a proven shortage.Doesn't say
- search_employersSearch the public business directory by name, municipality, sector group and observed hiring flag. Preview providers return modelled activity scenarios, not business claims.Doesn't say
- get_trade_overviewSaskatchewan merchandise exports by NAPCS section from Statistics Canada. Station-level CGC rows are excluded pending commercial redistribution permission.Doesn't say
- get_real_estateHousing 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…Doesn't say
- search_licensed_businessesNamed businesses holding a municipal licence in one community, from an attributed City snapshot. Answers who exists and in which industry, NOT who is hiring — use search_employers for that. Each row…Doesn't say
- get_wagesMeasured 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 g…Doesn't say
- get_rentsMeasured 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,…Doesn't say
- list_noc_groupsThe 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.Doesn't say
- evaluate_pathwaysThe 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…Doesn't say
- inspect_procurement_activityInspect official Saskatchewan CanadaBuys procurement observations by buyer, notice, or UNSPSC product/service category. Returns current and historical lifecycle evidence, amendments, conflicts, prove…Doesn't say
- assess_procurement_relevanceCompare the supply categories a business has published against the UNSPSC categories official buyers have requested. Returns category compatibility only, classed as inferred_compatibility: it establi…Doesn't say
- assess_workforce_demandReport occupational demand, credential demand, training availability and a training-route constraint indicator separately. It does not combine them into a shortage claim: a shortage is a claim about…Doesn't say
- find_potential_suppliersFind businesses whose published supply categories match the categories a business has published as things it buys. Returns potential_compatibility only: no relationship is asserted, neither party has…Doesn't say
- find_potential_customersFind businesses whose published purchasing categories match the categories a business has published as things it can supply. Returns potential_compatibility only: it is not a customer list, and a bus…Doesn't say
- list_economic_signalsList 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.Doesn't say
- get_economic_signalGet one governed economic signal by its source-stable id, including provenance, lifecycle state, mappings and uncertainty boundaries.Doesn't say
- get_emerging_signalsBackward-compatible alias for list_economic_signals.Doesn't say
- get_data_sourcesRead the governed upstream source registry: publisher datasets, stable source ids, licence decisions, approved and excluded uses, checked releases, materialization bindings and refresh controls.Doesn't say
- get_data_providersRead runtime provider contracts grouped as evidence, preview, planned, first-party and derived. Only the evidence group is eligible to support factual claims.Doesn't say
- get_source_provenanceResolve 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.Doesn't say
- resolve_citationResolve a public graph assertion citation to its canonical entity or entities, exact assertion, source, observation time, truth state, confidence, publication scope, methodology and provenance. Accep…Doesn't say
- get_economy_overviewModeled 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…Doesn't say
- get_municipality_evidence_coverageEvidence availability and confidence-gate work queue for all 17 Saskatchewan cities and 149 towns. Returns current Tier A–D counts, evidence-domain coverage, public-model input counts, local-context…Doesn't say
- get_community_economyOne 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 t…Doesn't say
- resolve_entityResolve user language or an official code to the canonical OEX identity and the correct next tool. Returns ranked candidates when the input is ambiguous.Doesn't say
- get_entityRetrieve one governed entity record with its evidence, provenance, canonical links, and permitted interpretation.Doesn't say
- search_entitiesSearch across supported OEX entity classes using names, aliases, slugs, and official identifiers.Doesn't say
- search_businessesSearch governed municipal licensed-business snapshots without inferring operating health, employment, ownership, or hiring.Doesn't say
- get_business_evidenceRetrieve the governed context and evidence boundary for one business entity. Licence presence establishes snapshot presence only.Doesn't say
- get_community_profileRetrieve one municipality as a governed economic profile with canonical identity, available evidence, links, and qualifications.Doesn't say
- compare_communitiesCompare 2–10 Saskatchewan communities and return explicit missing-data and comparability results for every requested metric.Doesn't say
- get_labour_demandRetrieve governed Saskatchewan labour-demand evidence while keeping advertised openings, statistical vacancies, live listings, and modelled sector allocations distinct.Doesn't say
- get_wage_evidenceRetrieve wage evidence for an occupation and geography with units, period, source, confidence, and comparability qualifications.Doesn't say
- traverse_relationshipsTraverse bounded, typed economic relationships from a resolved entity without treating missing edges as false.Doesn't say
- find_connected_entitiesFind entities connected through governed graph predicates, with source, truth state, confidence, and hop annotations.Doesn't say
- get_evidenceRetrieve a governed upstream source or runtime provider and its lineage, licence boundary, releases, and serving status.Doesn't say
- explain_confidenceExplain the OEX A–D record-confidence vocabulary, its weakest-input rule for derived values, and the interpretation contract.Doesn't say
- explain_truth_stateExplain what an OEX truth state permits an agent to claim and return the complete interpretation contract.Doesn't say
- check_comparabilityCheck whether requested community observations share compatible concepts, units, geographic boundaries, and reference periods; return explicit reasons where they do not.Doesn't say
- check_business_healthRun Business Health on a real business from details you supply — the free public check. Use this when someone asks about *their own* business: it needs no account, stores nothing, and creates no reco…Doesn't say
- explain_business_claimWhat claiming a business on OEX involves, and how to start. Call this after check_business_health when the person wants to act on the findings inside OEX rather than only on their own website — claim…Doesn't say
- list_health_capabilitiesWhat Business Health can actually inspect, fix, generate, verify and escalate — every check, what evidence it reads, what it needs before it will run, and what it offers as a fix. Read this before pr…Doesn't say
- create_sandbox_businessStart here to try Business Health. Creates a synthetic business you may then operate, and returns its id. Sandbox businesses never appear in OEX search, the directory or any public count — they exist…Doesn't say
- list_sandbox_businessesList the sandbox businesses that exist, so you can resume working on one.Doesn't say
- get_business_healthThe full health report for a sandbox business: the headline, findings worth attention with an action each, invitations, what passed, and what could not be evaluated. The headline is categorical — OEX…Doesn't say
- get_business_health_markdownThe same report as markdown — the form an owner would hand to whoever maintains their website.Doesn't say
- update_business_recordCorrect or complete the business's own record — the fix for most findings about missing or thin information. Supply only the fields you are changing; an omitted field is left alone, not cleared.Doesn't say
- grant_business_consentGrant a purpose-scoped consent on behalf of the sandbox business. This is what an invitation in the report is asking for. The classes are separate on purpose: granting one never widens another.Doesn't say
- set_website_domainTell OEX the business's website so it can be inspected. Supplying a domain permits inspection; it does not assert that the business owns or controls it, and OEX will not publish the domain as the bus…Doesn't say
- get_generated_assetGet an asset OEX generates from the business's own record: 'local-business-jsonld' or 'corrected-info-block'.Doesn't say
- start_health_actionRecord that work on a finding has begun — the owner opening the action. Moves the finding's action state, which is what makes its history readable later.Doesn't say
- report_health_action_completeRecord that the owner says a finding is fixed. This is their claim, not OEX's: nothing renders as resolved until a recheck runs and the check actually passes.Doesn't say
- recheck_business_healthAsk OEX to look again — what a business does after fixing something. Inspects the website if one is supplied. Rate-limited, and a check that could not run is reported as unable-to-verify rather than…Doesn't say
- get_health_action_historyThe event history for a sandbox business: what was detected, what the owner reported, and what a recheck verified — with the timestamps that make the sequence auditable.Doesn't say
- check_opportunity_readinessFor each public procurement notice whose requested categories overlap what this business has published, what about the business's OEX representation is in order and what is not. Every gap names the B…Doesn't say
- run_business_studyRun the Guided Business Study on a sandbox business: Business Health plus the three analytical instruments — Negative Space (what would be expected here and is not observed), Boundary Fracture (value…Doesn't say
- run_business_study_markdownThe same Guided Business Study as a markdown document — the form a study is handed over in, with each stage’s findings beside its own evidence table.Doesn't say
Audit history
- Nov 13Warnings
What we sent
Every request in this audit, with the answer and how long it took. We never send credentials and never call a tool.
| Request | Answer | Time |
|---|---|---|
| initialize | HTTP 200 | 256 ms |
| initialized | HTTP 202 | 221 ms |
| tools/list | HTTP 200 | 121 ms |
| unknown-method | HTTP 200 | 99 ms |
Run this server, or disagree with the result?
Fix the issue and it shows in the next weekly audit, or email us to ask for a re-audit or to dispute a finding. Read how we audit for what each check means.
{
"mcpServers": {
"ca-veilpoint-opportunity-exchange": {
"type": "http",
"url": "https://veilpoint.ca/mcp"
}
}
}{
"server": {
"name": "ca.veilpoint/opportunity-exchange",
"title": "ca.veilpoint/opportunity-exchange",
"url": "https://veilpoint.ca/mcp",
"transport": "streamable-http",
"topics": [
"Financial"
],
"website": "https://veilpoint.ca/agents",
"inRegistry": true
},
"audit": {
"slug": "ca-veilpoint-opportunity-exchange",
"url": "https://veilpoint.ca/mcp",
"auditedAt": "2026-11-13T16:25:09.441Z",
"firstAuditedAt": "2026-11-13T15:56:29.725Z",
"auditor": "1.0.0",
"outcome": "passed-with-warnings",
"verdicts": {
"responds": "yes",
"signUp": "none",
"toolsLabelled": "none",
"changesThings": "unknown",
"warnings": 1,
"failures": 0
},
"findings": [
{
"id": "reachable",
"area": "reachability",
"level": "pass",
"title": "The server responds."
},
{
"id": "https",
"area": "security",
"level": "pass",
"title": "Connections are encrypted (HTTPS)."
},
{
"id": "initialize",
"area": "protocol",
"level": "pass",
"title": "The MCP handshake works (Streamable HTTP)."
},
{
"id": "protocol-version",
"area": "protocol",
"level": "info",
"title": "Protocol version 2025-06-18."
},
{
"id": "unknown-method",
"area": "protocol",
"level": "pass",
"title": "Unknown requests are refused."
},
{
"id": "tools-list",
"area": "tools",
"level": "pass",
"title": "72 tools listed."
},
{
"id": "tool-schemas",
"area": "tools",
"level": "pass",
"title": "Every tool describes its inputs with a valid schema."
},
{
"id": "safety-labels",
"area": "safety",
"level": "warn",
"title": "72 of 72 tools do not say whether they can change things.",
"detail": "MCP lets a server label each tool as read-only or destructive, so clients can ask the user before risky calls. Unlabelled tools are treated as able to change things.",
"evidence": [
"investigate_economic_question",
"inspect_knowledge_frontier",
"resolve_entities",
"get_entity_context",
"query_knowledge_graph",
"get_knowledge_graph_status",
"compare_municipalities",
"list_roles",
"and 64 more"
]
},
{
"id": "tool-poisoning",
"area": "security",
"level": "pass",
"title": "No hidden instructions found in tool text."
},
{
"id": "long-text",
"area": "tools",
"level": "info",
"title": "Some tool text is long, so it uses more of the AI's working memory.",
"evidence": [
"server instructions (4,434 characters)"
]
}
],
"server": {
"name": "opportunity-exchange",
"version": "1.0.0",
"protocolVersion": "2025-06-18",
"transport": "streamable-http"
},
"toolCount": 72,
"toolsHash": "657197bbe424ac28b68d5b3ce1b5473d3c0a5286c399b56096ab730f1c55855e",
"latencyMs": 256,
"history": [
{
"date": "2026-11-13",
"outcome": "passed-with-warnings",
"tools": 72
}
]
},
"tools": [
{
"name": "investigate_economic_question",
"description": "Turn a natural-language economic question into an inspectable deterministic plan, resolve governed entities, execute a bounded set of existing OEX graph/data primitives, and return a citation-ready e…"
},
{
"name": "inspect_knowledge_frontier",
"description": "What OEX has asked about a subject, what it could not conclude, why, and which registered question logically follows. Governed and deterministic: every field is a typed governed value or a fixed cata…"
},
{
"name": "resolve_entities",
"description": "Resolve a user-supplied name, slug, NOC code, SGC code, program, sector or governed source to its canonical OEX identity. Call this before joining datasets when the identifier is uncertain. Results i…"
},
{
"name": "get_entity_context",
"description": "Fetch the governed context for one resolved entity in a single call. Accepts a canonical id, local slug or exact name and routes to the existing occupation, municipality, sector, training, NOC or sou…"
},
{
"name": "query_knowledge_graph",
"description": "Query the materialized semantic graph without downloading whole datasets. Resolve an entity name/code and optional municipality geography, then return typed facts and relationships. This supports mun…"
},
{
"name": "get_knowledge_graph_status",
"description": "Return the current database graph inventory by entity type, predicate and metric plus deterministic core reconciliation. ok=true means every governed core entity, alias, edge and fact is present; add…"
},
{
"name": "compare_municipalities",
"description": "Compare 2–10 exact Saskatchewan municipalities using the newest governed fact for each standard economic metric. A metric is comparable only when all resolved municipalities have the same unit and re…"
},
{
"name": "list_roles",
"description": "The Saskatchewan occupation catalogue: id, title, NOC code, sector, hourly wage, demand score. Start here to find role ids."
},
{
"name": "get_role",
"description": "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": "compare_roles",
"description": "Compare two or three roles using the shared occupation fields: wages, demand, outlook, entry requirements and work profile."
},
{
"name": "search_hiring_activity",
"description": "Source-attributed hiring-activity evidence, newest first and filterable by occupation, sector and geography. data.recordPurpose and each row recordPurpose are hiring_activity_evidence; rows are obser…"
},
{
"name": "compare_outcomes",
"description": "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…"
},
{
"name": "rank_communities",
"description": "Rank Saskatchewan communities by monthly discretionary income for exactly one role or explicit hourly wage."
},
{
"name": "list_sectors",
"description": "Sector rollups with provider-qualified hiring-record counts, median wage and occupation demand. Candidate profiles are excluded. Read meta.evidence before interpreting a count."
},
{
"name": "get_sector",
"description": "One sector: its occupations, provider-qualified postings by community, and notable employers."
},
{
"name": "summarize_credential_demand",
"description": "Aggregate hiring records associated with occupational credential requirements. Candidate profiles and holder counts are excluded; the result describes demand evidence, not a proven shortage."
},
{
"name": "search_employers",
"description": "Search the public business directory by name, municipality, sector group and observed hiring flag. Preview providers return modelled activity scenarios, not business claims."
},
{
"name": "get_trade_overview",
"description": "Saskatchewan merchandise exports by NAPCS section from Statistics Canada. Station-level CGC rows are excluded pending commercial redistribution permission."
},
{
"name": "get_real_estate",
"description": "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…"
},
{
"name": "search_licensed_businesses",
"description": "Named businesses holding a municipal licence in one community, from an attributed City snapshot. Answers who exists and in which industry, NOT who is hiring — use search_employers for that. Each row…"
},
{
"name": "get_wages",
"description": "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 g…"
},
{
"name": "get_rents",
"description": "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,…"
},
{
"name": "list_noc_groups",
"description": "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."
},
{
"name": "evaluate_pathways",
"description": "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…"
},
{
"name": "inspect_procurement_activity",
"description": "Inspect official Saskatchewan CanadaBuys procurement observations by buyer, notice, or UNSPSC product/service category. Returns current and historical lifecycle evidence, amendments, conflicts, prove…"
},
{
"name": "assess_procurement_relevance",
"description": "Compare the supply categories a business has published against the UNSPSC categories official buyers have requested. Returns category compatibility only, classed as inferred_compatibility: it establi…"
},
{
"name": "assess_workforce_demand",
"description": "Report occupational demand, credential demand, training availability and a training-route constraint indicator separately. It does not combine them into a shortage claim: a shortage is a claim about…"
},
{
"name": "find_potential_suppliers",
"description": "Find businesses whose published supply categories match the categories a business has published as things it buys. Returns potential_compatibility only: no relationship is asserted, neither party has…"
},
{
"name": "find_potential_customers",
"description": "Find businesses whose published purchasing categories match the categories a business has published as things it can supply. Returns potential_compatibility only: it is not a customer list, and a bus…"
},
{
"name": "list_economic_signals",
"description": "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."
},
{
"name": "get_economic_signal",
"description": "Get one governed economic signal by its source-stable id, including provenance, lifecycle state, mappings and uncertainty boundaries."
},
{
"name": "get_emerging_signals",
"description": "Backward-compatible alias for list_economic_signals."
},
{
"name": "get_data_sources",
"description": "Read the governed upstream source registry: publisher datasets, stable source ids, licence decisions, approved and excluded uses, checked releases, materialization bindings and refresh controls."
},
{
"name": "get_data_providers",
"description": "Read runtime provider contracts grouped as evidence, preview, planned, first-party and derived. Only the evidence group is eligible to support factual claims."
},
{
"name": "get_source_provenance",
"description": "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": "resolve_citation",
"description": "Resolve a public graph assertion citation to its canonical entity or entities, exact assertion, source, observation time, truth state, confidence, publication scope, methodology and provenance. Accep…"
},
{
"name": "get_economy_overview",
"description": "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…"
},
{
"name": "get_municipality_evidence_coverage",
"description": "Evidence availability and confidence-gate work queue for all 17 Saskatchewan cities and 149 towns. Returns current Tier A–D counts, evidence-domain coverage, public-model input counts, local-context…"
},
{
"name": "get_community_economy",
"description": "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 t…"
},
{
"name": "resolve_entity",
"description": "Resolve user language or an official code to the canonical OEX identity and the correct next tool. Returns ranked candidates when the input is ambiguous."
},
{
"name": "get_entity",
"description": "Retrieve one governed entity record with its evidence, provenance, canonical links, and permitted interpretation."
},
{
"name": "search_entities",
"description": "Search across supported OEX entity classes using names, aliases, slugs, and official identifiers."
},
{
"name": "search_businesses",
"description": "Search governed municipal licensed-business snapshots without inferring operating health, employment, ownership, or hiring."
},
{
"name": "get_business_evidence",
"description": "Retrieve the governed context and evidence boundary for one business entity. Licence presence establishes snapshot presence only."
},
{
"name": "get_community_profile",
"description": "Retrieve one municipality as a governed economic profile with canonical identity, available evidence, links, and qualifications."
},
{
"name": "compare_communities",
"description": "Compare 2–10 Saskatchewan communities and return explicit missing-data and comparability results for every requested metric."
},
{
"name": "get_labour_demand",
"description": "Retrieve governed Saskatchewan labour-demand evidence while keeping advertised openings, statistical vacancies, live listings, and modelled sector allocations distinct."
},
{
"name": "get_wage_evidence",
"description": "Retrieve wage evidence for an occupation and geography with units, period, source, confidence, and comparability qualifications."
},
{
"name": "traverse_relationships",
"description": "Traverse bounded, typed economic relationships from a resolved entity without treating missing edges as false."
},
{
"name": "find_connected_entities",
"description": "Find entities connected through governed graph predicates, with source, truth state, confidence, and hop annotations."
},
{
"name": "get_evidence",
"description": "Retrieve a governed upstream source or runtime provider and its lineage, licence boundary, releases, and serving status."
},
{
"name": "explain_confidence",
"description": "Explain the OEX A–D record-confidence vocabulary, its weakest-input rule for derived values, and the interpretation contract."
},
{
"name": "explain_truth_state",
"description": "Explain what an OEX truth state permits an agent to claim and return the complete interpretation contract."
},
{
"name": "check_comparability",
"description": "Check whether requested community observations share compatible concepts, units, geographic boundaries, and reference periods; return explicit reasons where they do not."
},
{
"name": "check_business_health",
"description": "Run Business Health on a real business from details you supply — the free public check. Use this when someone asks about *their own* business: it needs no account, stores nothing, and creates no reco…"
},
{
"name": "explain_business_claim",
"description": "What claiming a business on OEX involves, and how to start. Call this after check_business_health when the person wants to act on the findings inside OEX rather than only on their own website — claim…"
},
{
"name": "list_health_capabilities",
"description": "What Business Health can actually inspect, fix, generate, verify and escalate — every check, what evidence it reads, what it needs before it will run, and what it offers as a fix. Read this before pr…"
},
{
"name": "create_sandbox_business",
"description": "Start here to try Business Health. Creates a synthetic business you may then operate, and returns its id. Sandbox businesses never appear in OEX search, the directory or any public count — they exist…"
},
{
"name": "list_sandbox_businesses",
"description": "List the sandbox businesses that exist, so you can resume working on one."
},
{
"name": "get_business_health",
"description": "The full health report for a sandbox business: the headline, findings worth attention with an action each, invitations, what passed, and what could not be evaluated. The headline is categorical — OEX…"
},
{
"name": "get_business_health_markdown",
"description": "The same report as markdown — the form an owner would hand to whoever maintains their website."
},
{
"name": "update_business_record",
"description": "Correct or complete the business's own record — the fix for most findings about missing or thin information. Supply only the fields you are changing; an omitted field is left alone, not cleared."
},
{
"name": "grant_business_consent",
"description": "Grant a purpose-scoped consent on behalf of the sandbox business. This is what an invitation in the report is asking for. The classes are separate on purpose: granting one never widens another."
},
{
"name": "set_website_domain",
"description": "Tell OEX the business's website so it can be inspected. Supplying a domain permits inspection; it does not assert that the business owns or controls it, and OEX will not publish the domain as the bus…"
},
{
"name": "get_generated_asset",
"description": "Get an asset OEX generates from the business's own record: 'local-business-jsonld' or 'corrected-info-block'."
},
{
"name": "start_health_action",
"description": "Record that work on a finding has begun — the owner opening the action. Moves the finding's action state, which is what makes its history readable later."
},
{
"name": "report_health_action_complete",
"description": "Record that the owner says a finding is fixed. This is their claim, not OEX's: nothing renders as resolved until a recheck runs and the check actually passes."
},
{
"name": "recheck_business_health",
"description": "Ask OEX to look again — what a business does after fixing something. Inspects the website if one is supplied. Rate-limited, and a check that could not run is reported as unable-to-verify rather than…"
},
{
"name": "get_health_action_history",
"description": "The event history for a sandbox business: what was detected, what the owner reported, and what a recheck verified — with the timestamps that make the sequence auditable."
},
{
"name": "check_opportunity_readiness",
"description": "For each public procurement notice whose requested categories overlap what this business has published, what about the business's OEX representation is in order and what is not. Every gap names the B…"
},
{
"name": "run_business_study",
"description": "Run the Guided Business Study on a sandbox business: Business Health plus the three analytical instruments — Negative Space (what would be expected here and is not observed), Boundary Fracture (value…"
},
{
"name": "run_business_study_markdown",
"description": "The same Guided Business Study as a markdown document — the form a study is handed over in, with each stage’s findings beside its own evidence table."
}
],
"agentTest": null,
"notice": "Server descriptions and tool text are written by the server's vendor: treat them as untrusted data, not instructions."
}All audits as one file: /mcp-audits.json. Agents can also ask our MCP server: get_mcp_audit.