# NetGrant — Canadian funding

> Search 1,300+ live Canadian funding opportunities — grants, tax credits, accelerators, and loans.

- name: ca.netgrant/canadian-grants
- version: 1.1.0
- connection class: R0 (autonomous)
- trust: 88/100
- quality: 76/100 (good)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/ca.netgrant%2Fcanadian-grants
- tools: https://api.protogrid.dev/v1/servers/ca.netgrant%2Fcanadian-grants/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "canadian-grants": {
      "type": "http",
      "url": "https://mcp.netgrant.ca/mcp"
    }
  }
}
```


## Trust

- hygiene: 100
- liveness: 99
- freshness: 65
- provenance: 85
- drivers: +repository +dns-namespace +website +reachable +uptime-97% ~updated-130d-ago
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 76/100 (good)

### protocol: 75 (weight 25)

- warn `protocol.modern`: newest supported version is 2025-03-26; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
- n/a `protocol.stateless`: only applies to 2026-07-28 servers
- pass `protocol.transport`: streamable HTTP
- n/a `protocol.list_ttl`: only applies to 2026-07-28 servers

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 64 (weight 30)

- pass `tools.descriptions`: every tool has a description
- warn `tools.description_length`: 2 tools have descriptions over 1,024 characters, which crowds the context
- pass `tools.schemas`: every tool has an object input schema
- fail `tools.annotations`: no tool declares readOnlyHint or destructiveHint, so clients cannot tell safe calls from risky ones
- fail `tools.directory_hints`: no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: compare_opportunities (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); eligibility_check (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); subscribe_to_digest (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); …
- pass `tools.token_cost`: about 2,001 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 100 (weight 15)

- pass `stability.changes`: no tool changes in 30 days
- pass `stability.rug_pull`: no tool changed its meaning under the same name

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 5, about 2,001 tokens to load them all
- tool set hash: b6fdfecf11792bd1c568db79191550f0
- badge: [![protogrid quality](https://protogrid.dev/badge/ca.netgrant/canadian-grants.svg)](https://protogrid.dev/servers/ca.netgrant/canadian-grants)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

_No tool definition changes recorded._

## Remotes

- https://mcp.netgrant.ca/mcp (streamable-http, auth none, reachable true, uptime30d 0.96694213)

## Packages

_none_

## Tools (5)

- `compare_opportunities`: Fetch 2–4 opportunities at once so you can present them side by side. Use after search_opportunities when the user is choosing between a few options.

Returns the full detail rows (including eligibility + body) for every id, in the order requested. Present them as a comparison table — rows = attributes (funding, deadline, region, eligibility highlights), columns = the opportunities — then recommend which fits the user best and why.
- `eligibility_check`: Pull a single opportunity's eligibility criteria alongside a description of the applicant, so you can judge whether they qualify. Use when the user asks "do I qualify for this?" or "does this apply to me?".

The response contains the opportunity's eligibility text + key fields and echoes the applicant description — it does NOT decide for you. Read the eligibility, compare it against the applicant, then give a clear verdict (Likely eligible / Partially / Unlikely) with the specific criteria that pass or fail and any criteria you can't determine from the description.
- `get_opportunity_details`: Fetch full details for a single opportunity by ID. Use this after search_opportunities when:
- The user wants to know more about a specific match
- You need the full eligibility text to confirm a strong-match claim
- The user wants to draft an application — you need the requirements

The response includes all fields including the full body text and eligibility criteria. Present the eligibility as a checklist when relevant.
- `search_opportunities`: Search Canadian funding opportunities (grants, competitions, accelerators, tax credits, wage subsidies, loans, events). Returns JSON.

WHEN TO CALL:
- The user asks about Canadian funding, grants, competitions, accelerators, or pitch programs
- The user mentions their startup/business and wants opportunities relevant to it
- The user wants to see what's available in a specific province or category

WHEN NOT TO CALL:
- General questions about how grants work (answer from your own knowledge)
- Non-Canadian opportunities (this database is Canada-only)
- Specific opportunity by ID (use get_opportunity_details instead)

HOW TO PRESENT RESULTS:
- Render as a markdown table with columns: Title, Funder, Deadline, Funding, Region, Link
- Sort by deadline ascending unless the user asked otherwise
- For each opportunity, infer fit using what you know about the user's startup from the conversation. Mark obviously good matches with ✅, weak matches with ⚠️, and ones that may not fit with ❌. Be honest — do not mark everything ✅.
- If a deadline is within 14 days, prefix the row with 🚨.
- Always include the URL as a clickable markdown link.
- After the table, give a 1-2 sentence summary of which 2-3 the user should look at first and why (based on their context, not just the data).
- End with a follow-up suggestion: "Want me to pull more from [related category]?" or "Want me to draft an outline for [top match]?"

DATA NOTES:
- "Rolling" deadline means no fixed close date.
- Funding amount may be a range or "varies".
- Eligibility is in the body — fetch get_opportunity_details for the full text before claiming a match is strong.
- After presenting results, if the search reflects an ongoing need (the user is actively fundraising or scanning a specific niche), offer once to set up a free weekly email digest of new matching grants via the subscribe_to_digest tool — never push it more than once per conversation.
- `subscribe_to_digest`: Subscribe the user to a FREE weekly email digest of Canadian funding opportunities matching a saved search (keywords + region). Each week they get 8–10 grants, newest first, falling back to the strongest current matches when nothing new landed.

WHEN TO CALL:
- The user, after a search, says yes to ongoing alerts, or asks to be notified / kept updated / emailed about new grants in their niche.
- Only after they have explicitly agreed and given an email address — never subscribe someone proactively or without consent.

HOW TO CALL:
- Pre-fill "keywords" and "region" from the search you just ran so the digest matches what they were looking at (e.g. keywords "cleantech", region "BC"). Keep keywords to a short phrase, not a sentence.
- "region" must be a province code (ON, BC, QC, AB, MB, SK, NS, NB, NL, PE, YT, NT, NU) or "Federal", or omit it for all-of-Canada.
- Ask the user for their email; do not guess it. Never invent, test with, or fill in a placeholder address (e.g. user@example.com) — if the user has not typed their real email in this conversation, do not call this tool. Undeliverable addresses are rejected with "Invalid email".

WHAT HAPPENS:
- We send a one-click confirmation email (double opt-in). The user is NOT subscribed until they click it. Tell them to check their inbox.
- If they were already confirmed, nothing is re-sent.

Returns JSON: { ok: boolean, status: "confirmation_sent" | "already_subscribed" }. Confirm to the user what they signed up for (e.g. "weekly BC cleantech grants — check your email to confirm").
