GrantCortex/Docs/MCP server
Documentation

GrantCortex MCP server

GrantCortex puts the entire EU and national grant lifecycle behind a tool layer your agent already knows how to call. Connect over the Model Context Protocol and you get source-cited search across 4 funding ecosystems, a deterministic eligibility engine, an SME calculator, delta-monitoring and submission guidance — all from a single hosted endpoint.

Live endpoint. The server is hosted at mcp.grantcortex.eu over streamable HTTP and authenticated with a per-tester bearer token. No install, no local cache to seed.

The server is read-mostly: every tool reads from a daily-refreshed cache, none mutate your data. The agent writes the prose — GrantCortex supplies structured data, eligibility verdicts and context tools. Each response carries provenance (source URL, fetch time, confidence) so an answer can always be traced back to an official portal page.

What's inside#

  • 10 tools — search, partner discovery, SME classification, eligibility, evaluation criteria, change-monitoring, submission guides and prep timelines.
  • 2 resources (optional) — grantcortex://grants/all and grantcortex://grants/{identifier} for direct record access.
  • 1 prompt (optional) — summarise_grant_hu for a cited Hungarian summary.
  • 4 data sources — EU F&T Portal (Horizon Europe · Digital Europe · EDF), CORDIS, Vinnova (SE) and RVO (NL). Five more national sources (NKFIH, palyazat.gov.hu, KAP, MTA/HUN-REN, FFG) are under licensing review.

Quickstart#

Pick your client, paste the endpoint and your bearer token, and the tools appear in the agent's tool menu. The same streamable-HTTP endpoint works for every MCP-capable client.

1/11Open Settings from your profile menu, then click Security and login in the sidebar.
NameGrantCortex
Server URLhttps://mcp.grantcortex.eu/mcp
AuthenticationOAuth — on the consent page, paste the API key you received from us
Requires Developer mode (Settings → Security and login) and adding GrantCortex as a Plugin — the walkthrough above covers every click. Read-only tools (everything except the admin refresh) are safe to enable for autonomous use.

Your first call#

Once connected, ask the agent something the cache can answer — it will pick the right tool:

prompt
"Use grantcortex_search_grants to find open Horizon Europe topics about hydrogen,
 max 5 results, and show the deadline + source URL for each."

"Run grantcortex_check_eligibility on HORIZON-CL6-2026-01-CIRCBIO-07
 for a 45-person German SME and surface the verdict note verbatim."
A healthy response includes the grant identifier, a provenance.oldest_fetched_at freshness floor, and the canonical source URL. If you see those, you're wired up correctly.

Authentication#

Every request carries a bearer token in the Authorization header. Tester API keys are self-service: you generate them in your account, and each is shown only once at creation — store yours in a secret manager, not in source control.

http
POST https://mcp.grantcortex.eu/mcp
Authorization: Bearer gctx_•••••••••••••••••••
Content-Type: application/json

To get a tester key: sign up at grantcortex.eu/signup, verify your email address, then generate an API key on your account page. The key (prefixed gctx_…) is shown only once at creation — copy it immediately and store it in a secret manager.

Scopes#

ScopeGrants access to
userAll 10 core read-only tools, both resources and the prompt. This is what tester keys receive.
Rate limits. The edge applies a per-IP and per-token ceiling (≈120 / 60 requests per minute) with the /health probe exempt. A burst returns HTTP 429 with a Retry-After header — back off and retry rather than hammering.

Responses & provenance#

Most tools return a ToolResponse envelope: a typed data payload plus an aggregated provenance block. Provenance is non-negotiable — it's how a downstream answer stays audit-defensible.

FieldMeaning
dataThe tool's typed result — a list of grants, a verdict, a guide, a timeline.
provenance.oldest_fetched_atThe freshness floor across every contributing record. Treat it as the answer's "as of" date.
provenance.min_confidenceLowest confidence among contributing sources.
provenance.source_urlsOfficial portal pages backing the result — cite these to the user.
source_countsgrantcortex_search_grants only — true match volume per backend, even when rows are truncated by max_results.
When a record is missing, tools raise a typed error rather than inventing data. A null pillar or an "unknown" verdict is a deliberate signal, never a silent fabrication.

Two surfaces, one server#

Tools that take a format argument return structured json by default for autonomous agents, or rendered markdown for a human reading in Claude Desktop. Same data, two shapes — choose per call.

Eligibility engine#

grantcortex_check_eligibility runs a deterministic rule engine — same input, same output — over a topic's recorded criteria plus the organisation profile you pass in. It evaluates four buckets and aggregates them into one verdict.

  • country — prefers a parsed Work-Programme Annex eligibility list; falls back to an EU-27 + associated-country snapshot, then to unknown.
  • organisation_type — matches the profile against recorded entity-type rules.
  • sme_status — derived from company_size on the profile.
  • special_conditions — free-text rules; always unknown by design, and orthogonal to the aggregate.
Indicative filter, not legal advice. The verdict is a triage signal. Always surface the response note (the LIMITATIONS_NOTE) verbatim to the end user — re-phrasing it as a binding decision is explicitly prohibited.

Freshness & limits#

The cache refreshes automatically once a day (~03:30 UTC) across the daily-cheap source set. Use grantcortex_list_new_grants to spot newly indexed calls (the per-field calls_changed_since diff is coming soon), and grantcortex_build_prep_timeline to reverse-schedule from a deadline.

  • Hybrid by default, pure lexical on demand. grantcortex_search_grants fuses keyword matching with a cross-language vector ranking out of the box — a Hungarian query also finds English calls, synonyms and translations included. Pass lexical_only: true for an exact keyword match.
  • Cross-language switches off in lexical_only mode. With lexical_only: true an English keyword misses Hungarian-titled grants and vice versa — leave the default hybrid on, or try both languages.
  • CORDIS can flood. The 21k+ project archive dominates common-word queries — lean on source_counts and scope with source_system.
  • Coverage gaps are explicit. Evaluation-criteria extraction and Annex-aware country checks are documented partial-coverage; the tools say so rather than guessing.

Data sources#

4 ingested ecosystems feed the catalog. By default grantcortex_search_grants queries the EU-level sources (SEDIA + CORDIS); the national sources (Vinnova, RVO) are reached by naming them in the source_system argument.

SEsedia
SEDIA · Horizon Europe
EIC · MSCA · ERC · Clusters 1–6
COcordis
CORDIS
Funded-project archive, FP7 → Horizon Europe
SEvinnova
Vinnova
Sweden's innovation agency
NLrvo
RVO
Netherlands Enterprise Agency

Alongside the live caches, GrantCortex ships a curated submission-guide knowledge base (Horizon RIA, EIC Accelerator, Digital Europe, ERC-StG, MSCA, Interreg, NKFIH and palyazat.gov.hu), served by grantcortex_get_submission_guide.

Tools#

10 read-only core tools on the public launch surface. All declare read-only / idempotent hints where they apply, so MCP clients show the right badges. Optional arguments have sensible defaults.

Available now vs. coming soon. The public launch serves the 10 core tools. Tools marked coming soon (proposal-support tools, organisation search and the call-document tools) are on the public roadmap — see the roadmap page.
grantcortex_search_grants()read-only

Keyword search over the cached grant catalog — 4 live backends: Horizon/SEDIA (Horizon Europe · Digital Europe · EDF), CORDIS, Vinnova (SE), RVO (NL). HYBRID by default: the FTS5 keyword ranking (diacritic-insensitive, multi-word AND, BM25) is fused with a cross-language vector ranking, so a Hungarian query also finds English calls; pass `lexical_only: true` for pure exact-keyword matching. Default scope is EU-level (SEDIA + CORDIS) — the national sources (Vinnova, RVO) are only searched when named in `source_system`.

Parameters
NameTypeDescription
keywordrequiredstringSearch terms, or an exact topic/call identifier — an ID-shaped keyword resolves directly to its cached record. Empty returns the first results in each backend's native order.
max_resultsoptionalint1–100, default 10. Aggregated mode allocates the budget round-robin across backends.
offsetoptionalintPages the ranked result — pass the response `next_offset` (or offset=max_results) for the next page. Order is stable across pages. Default 0.
source_systemoptionalenumScope to one backend: sedia · cordis · vinnova · rvo. Omitted (default): EU-level sources only (SEDIA + CORDIS) — the national agencies vinnova (SE) and rvo (NL) are searched only when named here.
lexical_onlyoptionalboolOpt out of the default cross-language vector layer and match by pure FTS5 keyword only (exact, BM25-ranked). Use when a precise literal-keyword match is wanted and the semantic fusion would add unwanted neighbours. The un-embedded Cordis archive is lexical regardless. Default false.
verbosityoptionalenumconcise (default): each row carries a ~300-char lead summary without the related_calls / attribution extras — cheapest for scanning. detailed: the full row (complete summary, related_calls cross-references, attribution notice).
only_openoptionalboolCross-backend "currently applicable" filter — returns only grants still open to apply and excludes the Cordis archive entirely (distinct from the SEDIA-only status="open"). Default false.
exclude_archiveoptionalboolDrop only the Cordis funded-project archive while keeping every live-call backend (open and closed calls). only_open implies it. Default false.
programmeoptionalenumSEDIA-only facet: horizon (Pillar 2) · digital_europe · eic (EIC division) · pillar1 ("Excellent Science"). Auto-narrows to SEDIA; rejected alongside a non-SEDIA source_system.
status / deadline_from / deadline_to / min_budget_europtionalSEDIA filtersOpen-status, deadline window (YYYY-MM-DD), minimum budget. SEDIA only.
Returns

A list of compact GrantSummary rows, each with a canonical source-portal url, plus the pagination trio total_count / has_more / next_offset. source_counts reports the true match volume per backend — authoritative even when rows are truncated by max_results.

Matching is hybrid by default (FTS5 keyword + cross-language vectors) — a Hungarian query also finds English calls. Pass lexical_only: true for an exact keyword match. The default scope is EU-level (SEDIA + CORDIS): name source_system: "vinnova" / "rvo" for national calls, and re-query a single source_system when source_counts shows truncated matches.
grantcortex_recommend_grants()read-only

Rank currently-open grants that fit a business. Pipeline: query-expansion → only-open multi-backend retrieval (Cordis archive and closed calls excluded) → deterministic fit-scoring → a coarse eligibility pre-filter (reuses the rule engine, drops hard-block fails) → a ranked shortlist with per-grant fit_score and human-readable reasons.

Parameters
NameTypeDescription
profilerequiredBusinessProfileAll-optional: keywords, sector, nace_code, company_size, country_id, region_nuts, budget_eur, consortium_role, registry_year. An empty profile returns the open-grant corpus ranked by the remaining signals.
max_resultsoptionalintCaps the shortlist. Default 10.
Returns

A RecommendGrantsResultrecommendations (each with a fit_score and human-readable reasons), query_terms, eligibility_prefilter_applied, and a note.

Heuristic ranking, not advice — surface the response note verbatim. The authoritative eligibility check is the grantcortex_check_eligibility tool.
grantcortex_check_eligibility()read-only

Run the deterministic 4-bucket rule engine over a topic's recorded eligibility criteria plus the organisation profile you supply — country, organisation type, SME status and special conditions — and return a structured verdict.

Parameters
NameTypeDescription
grant_idrequiredstringHorizon Europe topic identifier.
profilerequiredOrganisationProfilecountry, organisation type, company_size, and any special-condition flags.
include_criteriaoptionalboolFalse (default): the response carries the verdict with per-bucket findings and the note — enough to answer the question. True: additionally include every recorded eligibility criterion with its provenance envelope (payload-heavy audit view; request only when the raw criteria text is needed).
Returns

A Verdict (decision: pass · fail · unknown), per-bucket reasons with evidence snippets, severity (soft_block vs hard_block) and a fixed note carrying the LIMITATIONS_NOTE.

Indicative filter, not a binding decision. Surface the response note verbatim — the country bucket prefers a parsed Work-Programme Annex but falls back to an EU-27 + associated snapshot, and the special-conditions bucket is always "unknown" for free-text rules.
grantcortex_compute_sme_status()read-only

Classify a company as micro / small / medium / large under Commission Recommendation 2003/361/EC. Consolidates linked enterprises at 100% and partner enterprises pro-rata (ignored below the 25% threshold).

Parameters
NameTypeDescription
headcountrequiredintAnnual work units of the focal company.
annual_turnover_eurrequiredfloatFocal company turnover in EUR.
balance_sheet_total_eurrequiredfloatFocal company balance-sheet total in EUR.
linked_enterprisesoptionalobject[]Each: headcount, turnover, balance, ownership_pct. Fully consolidated.
partner_enterprisesoptionalobject[]Each: headcount, turnover, balance, ownership_pct (drives pro-rata + 25% cut-off).
formatoptionalenumjson (default) or markdown.
Returns

category, autonomous flag, consolidated headcount / turnover / balance, breach_reasons when large, and computation_notes. Always cites the regulation.

grantcortex_list_new_grants()read-only

Delta-monitoring: return grants newly indexed since a given timestamp. Complements calls_changed_since — this one focuses on first-seen rather than last-modified rows, letting lightweight pipelines pick up brand-new opportunities without re-scanning the full catalogue.

Parameters
NameTypeDescription
sincerequiredint | ISO-8601Day-count (7 = the last week) or an ISO-8601 date/timestamp, e.g. 2026-06-01T00:00:00Z. Returns only rows whose first_seen_at is on or after the cutoff.
sourceoptionalenumall (default) · topics · vinnova · rvo — the change-tracked sources; others are deactivated pending licence review.
only_openoptionalboolDrop rows already closed for submission. Default true.
region / keyword / min_amount_eur / deadline_within_daysoptionalfiltersOptional narrowing: coarse funder region (EU · HU · V4 · AT · SE · NL · INTL), keyword, minimum award in EUR, deadline window in days.
limit / offsetoptionalintPagination. limit 1–200, default 50; the response carries total_count / has_more / next_offset.
formatoptionalenumjson (default) or markdown.
Returns

Rows of { source, identifier, title, first_seen_at, deadline, is_open, url } — ordered by first_seen_at descending (newest first), each with a url to the official source page. An empty list means nothing was ingested after the given time.

Use grantcortex_list_new_grants in scheduled pipeline runs (e.g. daily) to efficiently catch newly published calls. Deadline changes or status updates on existing calls will be covered by calls_changed_since (coming soon).
grantcortex_get_evaluation_criteria()read-only

Pull the three Horizon Europe evaluation pillars — Excellence, Impact, and Quality & efficiency of the implementation — for a topic. Primary source is the F&T Portal call-fiche PDF, with an HTML-regex fallback.

Parameters
NameTypeDescription
grant_idrequiredstringTopic identifier. Raises GrantNotFoundError if not cached.
Returns

EvaluationCriteria with excellence_text / impact_text / implementation_text (each may be null when the source doesn't surface it), plus total_max_score / scoring_threshold when the PDF carries them.

None-honesty by design: a pillar is null rather than guessed when the upstream document doesn't expose it in a recognisable form. Mainline Horizon clusters without a linked call-fiche are a known coverage gap.
grantcortex_find_cordis_partners()read-only

Find CORDIS-funded partner organisations by fuzzy legal-name match, aggregating participation across FP7 / H2020 / Horizon Europe. Useful for building a consortium or vetting a prospective partner's track record.

Parameters
NameTypeDescription
namerequiredstringOrganisation legal name. Trigram + substring fuzzy match handles typos (fraunhoffer ↔ Fraunhofer).
countryoptionalISO-3166 a2Filter to a country, e.g. DE, NL.
frameworkoptionalenumFP7 · H2020 · HE.
include_projectsoptionalboolDeep mode — adds a paginated per-project list (role, topic, EU contribution, period).
limit / offsetoptionalintPagination. limit 1–50, default 20.
formatoptionalenumjson (default) or markdown.
Returns

One PartnerSummary per matched org — total projects, total EU contribution (EUR), frameworks present, active years and representative topics. Ordered by project count, then funding.

grantcortex_get_submission_guide()read-only

Return the curated "how to submit" knowledge for a programme: submission portal, proposal structure (Part A / Part B + page limits and formats), signing roles (LEAR / LSIGN / FSIGN), common gotchas with severity, and official template links.

Parameters
NameTypeDescription
programmerequiredstringProgramme key — horizon-ria · eic-accelerator · digital-europe · erc-stg · msca · interreg-europe · nkfih-kfi · palyazat-gov (case-insensitive).
Returns

A full SubmissionGuide. Every gotcha carries a source_url + fetched_at; a stale-warning note appears when the curator review is older than 180 days — prefer the source URLs over cached text in that case.

grantcortex_build_prep_timeline()read-only

Build a funder-aware preparation timeline for a call, reverse-scheduled from its submission deadline — concept, draft, compliance and submit milestones, plus source-specific prerequisites like PIC/LEAR or EPTK registration.

Parameters
NameTypeDescription
topic_idrequiredstringHorizon topic identifier — further source-specific profiles activate as national sources clear licensing review.
todayoptionalISO dateCompute against a fixed date (YYYY-MM-DD) for deterministic planning. Defaults to server UTC date.
formatoptionalenumjson (default) or markdown.
Returns

Ordered milestones with target dates, a recommended start date, and a grant status (upcoming · in_window · urgent · overdue). Returns no_deadline / not_a_call when the record has no deadline or is a post-award project.

Heuristic estimates, not official requirements — a planning scaffold, not a compliance checklist.
grantcortex_render_hu_summary_template()read-only

Return a Hungarian-language summary prompt-template for a topic, pre-filled with its cached metadata and a four-element citation footer. Same body as the summarise_grant_hu prompt, but exposed as a tool so Claude Desktop auto-discovers it.

Parameters
NameTypeDescription
grant_idrequiredstringTopic identifier. Raises GrantNotFoundError if not cached.
Returns

A meta-instruction string (≤200-word brief, citation-footer requirements, fall-back guidance) for the agent to render a faithful magyar összefoglaló.

Coming soon

calls_changed_since()coming soon

Delta-monitoring: return calls that were first seen or last modified after a given timestamp. Point it at your last-checked time to catch new opportunities and updated deadlines without re-scanning the catalog.

Parameters
NameTypeDescription
sincerequiredISO-8601e.g. 2026-05-19T00:00:00Z. Rows newer than this on either timestamp are returned.
sourceoptionalenumall (default) · topics — further backends as sources clear licensing review.
limitoptionalint1–200, default 50.
include_diffoptionalboolAttach a field-level diff (deadline, status, amount…) for updated rows with a stored snapshot.
formatoptionalenumjson (default) or markdown.
Returns

Rows of { source, identifier, change_type, first_seen_at, last_modified_at } — change_type is new or updated; with include_diff each updated row carries the changed fields.

check_proposal_compliance()coming soon

Run a formal compliance QA pass over a proposal draft. Estimates character / word count and page count (~400 words per A4 page) and compares it to the programme's page budget. For Horizon-family programmes (horizon-ria, digital-europe, eic-accelerator, erc-stg, msca) it also checks the mandatory Part-B chapter headings and the GEP / Open Science / Data-Management-Plan checklist; for other programmes those content checks are skipped.

Parameters
NameTypeDescription
proposal_textrequiredstringThe draft body to QA.
programme_idoptionalstringe.g. horizon-ria — drives the page limit and whether the content-structure checks run.
check_content_structureoptionalboolOverride the content checks. Defaults to auto from programme_id.
formatoptionalenumjson (default) or markdown.
Returns

character_count, word_count, estimated_pages, page_limit, limit_exceeded, chapters[], checklist[], is_compliant, and a note.

is_compliant is a best-effort heuristic, not an official ruling.
analyze_reviewer_feedback()coming soon

Structure a Horizon Europe / H2020 Evaluation Summary Report (ESR) for resubmission planning. You extract the ESR text from the (applicant-confidential) PDF yourself — it stays on your side — and pass it as `esr_text`.

Parameters
NameTypeDescription
esr_textrequiredstringThe ESR body text you extracted from the PDF. Empty / garbage text raises an error rather than fabricating a result.
formatoptionalenumjson (default) or markdown.
Returns

Administrative metadata (proposal number, acronym, title, call, type of action, topic, duration), the total_score and the three per-pillar scores, the consortium proposers table, and per pillar the raw evaluator comment block plus heuristic strengths / weaknesses / recommendations.

Base your rewrite on the raw comments — the heuristic strengths / weaknesses lists are only hints.
search_organisations()coming soon

Search the F&T Portal / SEDIA organisation directory by keyword and/or country. The directory is not yet ingested into this deployment, so the tool returns a short "coming soon" notice rather than results.

Parameters
NameTypeDescription
keyword / country / limit / offset / formatoptionalWired but inactive until the org-sync pipeline lands.
Returns

A coming-soon notice. For partner discovery today use grantcortex_search_grants (opportunities) or grantcortex_find_cordis_partners (past participants).

find_consortium_partners()coming soon

Discover experienced consortium-partner organisations from the cached CORDIS project history, ranked by total EU contribution won. Complements grantcortex_find_cordis_partners: search by what a topic or theme needs rather than by a known organisation name.

Parameters
NameTypeDescription
topic_idoptionalstringExact CORDIS topic identifier.
keywordsoptionalstring[]FTS5 full-text over project title / acronym / objective.
countryoptionalISO-3166 a2Narrow to a country, e.g. DE, NL.
limitoptionalintPagination. Default 20.
formatoptionalenumjson (default) or markdown.
Returns

One candidate per org — pic, legal_name, country, project_count, total_contribution_eur, coordinator_count, partner_count and associated_projects. Ranked by total EU contribution won.

At least one of topic_id or keywords is required — an unfiltered call returns an empty list. A discovery aid over historical data: past participation doesn't imply availability — verify with the organisation.
get_call_document()coming soon

Resolve, fetch, parse, cache and return the full text of a call document — the work-programme call fiche / topic PDF behind a search result. Held off the public surface until the call-document corpus is re-pointed to a green, re-publishable source.

Parameters
NameTypeDescription
identifierrequiredstringGrant identifier as returned by grantcortex_search_grants (topic id, or a palyazat tender code / UUID — resolved to the canonical code).
sectionoptionalstringReturn only a named section of the parsed document.
max_charsoptionalintCap the returned text length — the full document can be large.
document_urloptionalstringBypass resolution and fetch a specific document URL.
Returns

A CallDocumentResult with the parsed document text and a source-cited provenance block.

search_grant_documents()coming soon

Semantic passage search inside the indexed call documents: embeds your question and returns the best-matching passages by cosine score — find the relevant paragraph without reading the whole fiche. Held off the public surface until the call-document corpus is re-pointed to a green, re-publishable source.

Parameters
NameTypeDescription
queryrequiredstringNatural-language question or keywords (multilingual).
grant_idoptionalstringRestrict the search to one call (tender code).
limitoptionalint1–25, best-first by score.
Returns

A DocumentPassageSearchResult — ranked passages, or an empty list with an honest note when the index is empty or the embedding model is unavailable (use get_call_document instead).

Advanced (optional)#

Most MCP clients only use tools — most testers can skip this section. Resources and the prompt are advanced primitives: useful when you want to fetch one record directly by identifier, or reach the raw summary template. A tool equivalent exists (grantcortex_render_hu_summary_template), so you don't strictly need them.

Resources

URIReturns
grantcortex://grants/all
eulex://grants/all deprecated — removed after 2026-10-07
JSON array of GrantSummary rows ordered by identifier, capped at 100. Use grantcortex_search_grants for narrower slices.
grantcortex://grants/{identifier}
eulex://grants/{identifier} deprecated — removed after 2026-10-07
Full record for one topic — the HorizonTopic payload plus its Provenance envelope (source URL, fetched_at, confidence). Supports prefix completion.
The resource-URI scheme changed from eulex:// to grantcortex:// (brand consistency). The old eulex:// identifiers still resolve during the backward-compat window but are removed after 2026-10-07 — please migrate to the grantcortex:// scheme.

Prompts

NameDescription
summarise_grant_huHungarian ≤200-word summary template for a topic, with a mandatory citation footer. The power-user surface behind grantcortex_render_hu_summary_template.
Claude Desktop auto-injects tools but expects a + / @ mention to opt into prompts and resources. That's why the Hungarian summary is also exposed as the grantcortex_render_hu_summary_template tool.

Errors#

Tools fail loudly with typed errors rather than returning misleading empty data. Each carries a message naming the cause.

ErrorRaised whenWhat to do
GrantNotFoundErrorgrant_id / topic_id has no row in the cache.Re-run grantcortex_search_grants to confirm the identifier, or trigger a refresh.
InvalidArgumentErrorAn argument is out of range or combines incompatibly (e.g. a SEDIA filter with source_system=cordis).The message names the offending argument and the valid set.
ProgrammeNotFoundErrorgrantcortex_get_submission_guide is called with an unknown programme key.The error lists every known key — pick one and retry.
PermissionErrorA user-scoped key (or the stdio transport) calls an admin-only tool.Tester keys are user-scoped by design; the daily ingest runs automatically, so no admin call is needed.

Compliance & limitations#

EU AI Act · limited-risk. GrantCortex tools function as deterministic filters, not legal decision-makers. The grantcortex_check_eligibility verdict is a triage signal — always surface the LIMITATIONS_NOTE verbatim to the end user. Silent agent hallucination is prohibited: a null pillar or "unknown" verdict is a deliberate signal, not a gap to fill in.

All tools return only source-cited answers: every GrantSummary and EvaluationCriteria object carries source_url and fetched_at fields. If a record is unavailable, the tool raises GrantNotFoundError rather than fabricating data.