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.
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/allandgrantcortex://grants/{identifier}for direct record access. - 1 prompt (optional) —
summarise_grant_hufor 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.
| Name | GrantCortex |
| Server URL | https://mcp.grantcortex.eu/mcp |
| Authentication | OAuth — on the consent page, paste the API key you received from us |
Your first call#
Once connected, ask the agent something the cache can answer — it will pick the right tool:
"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."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.
POST https://mcp.grantcortex.eu/mcp
Authorization: Bearer gctx_•••••••••••••••••••
Content-Type: application/jsonTo 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#
| Scope | Grants access to |
|---|---|
| user | All 10 core read-only tools, both resources and the prompt. This is what tester keys receive. |
/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.
| Field | Meaning |
|---|---|
| data | The tool's typed result — a list of grants, a verdict, a guide, a timeline. |
| provenance.oldest_fetched_at | The freshness floor across every contributing record. Treat it as the answer's "as of" date. |
| provenance.min_confidence | Lowest confidence among contributing sources. |
| provenance.source_urls | Official portal pages backing the result — cite these to the user. |
| source_counts | grantcortex_search_grants only — true match volume per backend, even when rows are truncated by max_results. |
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.
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_grantsfuses keyword matching with a cross-language vector ranking out of the box — a Hungarian query also finds English calls, synonyms and translations included. Passlexical_only: truefor an exact keyword match. - Cross-language switches off in lexical_only mode. With
lexical_only: truean 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_countsand scope withsource_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.
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.
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`.
| Name | Type | Description |
|---|---|---|
| keywordrequired | string | Search 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_resultsoptional | int | 1–100, default 10. Aggregated mode allocates the budget round-robin across backends. |
| offsetoptional | int | Pages the ranked result — pass the response `next_offset` (or offset=max_results) for the next page. Order is stable across pages. Default 0. |
| source_systemoptional | enum | Scope 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_onlyoptional | bool | Opt 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. |
| verbosityoptional | enum | concise (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_openoptional | bool | Cross-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_archiveoptional | bool | Drop only the Cordis funded-project archive while keeping every live-call backend (open and closed calls). only_open implies it. Default false. |
| programmeoptional | enum | SEDIA-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_europtional | SEDIA filters | Open-status, deadline window (YYYY-MM-DD), minimum budget. SEDIA only. |
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.
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.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.
| Name | Type | Description |
|---|---|---|
| profilerequired | BusinessProfile | All-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_resultsoptional | int | Caps the shortlist. Default 10. |
A RecommendGrantsResult — recommendations (each with a fit_score and human-readable reasons), query_terms, eligibility_prefilter_applied, and a note.
note verbatim. The authoritative eligibility check is the grantcortex_check_eligibility tool.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.
| Name | Type | Description |
|---|---|---|
| grant_idrequired | string | Horizon Europe topic identifier. |
| profilerequired | OrganisationProfile | country, organisation type, company_size, and any special-condition flags. |
| include_criteriaoptional | bool | False (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). |
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.
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.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).
| Name | Type | Description |
|---|---|---|
| headcountrequired | int | Annual work units of the focal company. |
| annual_turnover_eurrequired | float | Focal company turnover in EUR. |
| balance_sheet_total_eurrequired | float | Focal company balance-sheet total in EUR. |
| linked_enterprisesoptional | object[] | Each: headcount, turnover, balance, ownership_pct. Fully consolidated. |
| partner_enterprisesoptional | object[] | Each: headcount, turnover, balance, ownership_pct (drives pro-rata + 25% cut-off). |
| formatoptional | enum | json (default) or markdown. |
category, autonomous flag, consolidated headcount / turnover / balance, breach_reasons when large, and computation_notes. Always cites the regulation.
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.
| Name | Type | Description |
|---|---|---|
| sincerequired | int | ISO-8601 | Day-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. |
| sourceoptional | enum | all (default) · topics · vinnova · rvo — the change-tracked sources; others are deactivated pending licence review. |
| only_openoptional | bool | Drop rows already closed for submission. Default true. |
| region / keyword / min_amount_eur / deadline_within_daysoptional | filters | Optional narrowing: coarse funder region (EU · HU · V4 · AT · SE · NL · INTL), keyword, minimum award in EUR, deadline window in days. |
| limit / offsetoptional | int | Pagination. limit 1–200, default 50; the response carries total_count / has_more / next_offset. |
| formatoptional | enum | json (default) or markdown. |
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.
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.
| Name | Type | Description |
|---|---|---|
| grant_idrequired | string | Topic identifier. Raises GrantNotFoundError if not cached. |
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.
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.
| Name | Type | Description |
|---|---|---|
| namerequired | string | Organisation legal name. Trigram + substring fuzzy match handles typos (fraunhoffer ↔ Fraunhofer). |
| countryoptional | ISO-3166 a2 | Filter to a country, e.g. DE, NL. |
| frameworkoptional | enum | FP7 · H2020 · HE. |
| include_projectsoptional | bool | Deep mode — adds a paginated per-project list (role, topic, EU contribution, period). |
| limit / offsetoptional | int | Pagination. limit 1–50, default 20. |
| formatoptional | enum | json (default) or markdown. |
One PartnerSummary per matched org — total projects, total EU contribution (EUR), frameworks present, active years and representative topics. Ordered by project count, then funding.
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.
| Name | Type | Description |
|---|---|---|
| programmerequired | string | Programme key — horizon-ria · eic-accelerator · digital-europe · erc-stg · msca · interreg-europe · nkfih-kfi · palyazat-gov (case-insensitive). |
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.
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.
| Name | Type | Description |
|---|---|---|
| topic_idrequired | string | Horizon topic identifier — further source-specific profiles activate as national sources clear licensing review. |
| todayoptional | ISO date | Compute against a fixed date (YYYY-MM-DD) for deterministic planning. Defaults to server UTC date. |
| formatoptional | enum | json (default) or markdown. |
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.
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.
| Name | Type | Description |
|---|---|---|
| grant_idrequired | string | Topic identifier. Raises GrantNotFoundError if not cached. |
A meta-instruction string (≤200-word brief, citation-footer requirements, fall-back guidance) for the agent to render a faithful magyar összefoglaló.
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.
| Name | Type | Description |
|---|---|---|
| sincerequired | ISO-8601 | e.g. 2026-05-19T00:00:00Z. Rows newer than this on either timestamp are returned. |
| sourceoptional | enum | all (default) · topics — further backends as sources clear licensing review. |
| limitoptional | int | 1–200, default 50. |
| include_diffoptional | bool | Attach a field-level diff (deadline, status, amount…) for updated rows with a stored snapshot. |
| formatoptional | enum | json (default) or markdown. |
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.
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.
| Name | Type | Description |
|---|---|---|
| proposal_textrequired | string | The draft body to QA. |
| programme_idoptional | string | e.g. horizon-ria — drives the page limit and whether the content-structure checks run. |
| check_content_structureoptional | bool | Override the content checks. Defaults to auto from programme_id. |
| formatoptional | enum | json (default) or markdown. |
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.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`.
| Name | Type | Description |
|---|---|---|
| esr_textrequired | string | The ESR body text you extracted from the PDF. Empty / garbage text raises an error rather than fabricating a result. |
| formatoptional | enum | json (default) or markdown. |
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.
comments — the heuristic strengths / weaknesses lists are only hints.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.
| Name | Type | Description |
|---|---|---|
| keyword / country / limit / offset / formatoptional | — | Wired but inactive until the org-sync pipeline lands. |
A coming-soon notice. For partner discovery today use grantcortex_search_grants (opportunities) or grantcortex_find_cordis_partners (past participants).
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.
| Name | Type | Description |
|---|---|---|
| topic_idoptional | string | Exact CORDIS topic identifier. |
| keywordsoptional | string[] | FTS5 full-text over project title / acronym / objective. |
| countryoptional | ISO-3166 a2 | Narrow to a country, e.g. DE, NL. |
| limitoptional | int | Pagination. Default 20. |
| formatoptional | enum | json (default) or markdown. |
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.
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.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.
| Name | Type | Description |
|---|---|---|
| identifierrequired | string | Grant identifier as returned by grantcortex_search_grants (topic id, or a palyazat tender code / UUID — resolved to the canonical code). |
| sectionoptional | string | Return only a named section of the parsed document. |
| max_charsoptional | int | Cap the returned text length — the full document can be large. |
| document_urloptional | string | Bypass resolution and fetch a specific document URL. |
A CallDocumentResult with the parsed document text and a source-cited provenance block.
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.
| Name | Type | Description |
|---|---|---|
| queryrequired | string | Natural-language question or keywords (multilingual). |
| grant_idoptional | string | Restrict the search to one call (tender code). |
| limitoptional | int | 1–25, best-first by score. |
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
| URI | Returns |
|---|---|
grantcortex://grants/alleulex://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. |
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
| Name | Description |
|---|---|
| summarise_grant_hu | Hungarian ≤200-word summary template for a topic, with a mandatory citation footer. The power-user surface behind grantcortex_render_hu_summary_template. |
+ / @ 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.
| Error | Raised when | What to do |
|---|---|---|
| GrantNotFoundError | grant_id / topic_id has no row in the cache. | Re-run grantcortex_search_grants to confirm the identifier, or trigger a refresh. |
| InvalidArgumentError | An 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. |
| ProgrammeNotFoundError | grantcortex_get_submission_guide is called with an unknown programme key. | The error lists every known key — pick one and retry. |
| PermissionError | A 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#
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.