Eoa Mcp Server — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Eoa Mcp Server (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Production-ready MCP (Model Context Protocol) server for searching Greek insurance intermediaries via the EOA public registry (eoa.conet.gr).
cd mcp_server
npm install| Variable | Required | Default | Description |
|---|---|---|---|
EOA_AUSER | Yes | - | EOA API username (header AUSER) |
EOA_APASSWORD | Yes | - | EOA API password (header APASSWORD) |
EOA_BASE_URL | No | https://eoa.conet.gr | EOA API base URL (scheme + host + port, no trailing slash). Defaults to production; for a local Django dev server set e.g. http://127.0.0.1:8000 so MCP calls your instance (required to use local-only API changes such as new filters). |
PORT | No | 8080 | HTTP server port |
CACHE_TTL_SECONDS | No | 600 | Cache TTL for identical requests (10 min) |
Development (with watch):
npm run devProduction:
npm run build
npm start| Method | Path | Description |
|---|---|---|
| GET | /health | Health check (returns { status: "ok" }) |
| POST | /mcp | MCP JSON-RPC messages (tools, initialization, etc.) |
| GET | /mcp | Returns 405 (use POST) |
All tools return JSON with results, optional total, source_note, and errors.
search_intermediariesGeneral search by query and filters.
Inputs:
| Parameter | Type | Default | Description | ||
|---|---|---|---|---|---|
query | string | - | Search by name (partial match) | ||
vat | string | - | VAT number (9 digits) | ||
gemi | string | - | GEMI registration number | ||
keee_categories | string[] | - | KEEE category values | ||
license_status | "active" \ | "expired" \ | "no_info" | - | License status filter |
main_activity | "any" \ | "main" \ | "secondary" | - | Main activity filter |
legaltype_ids | string[] | - | Legal type IDs (see list_legal_types) | ||
page | number | 1 | Page number | ||
page_size | number | 20 | Page size (max 50) | ||
order_by | string[] | - | Sort fields: vatnumber, gemiTradeName, keeeLicenceExpiration, gemiIncorporationDate, lastUpdate (prefix - for descending) | ||
gemi_incorporation_date_from | string | - | Inclusive lower bound for GEMI incorporation date (YYYY-MM-DD); use alone or with gemi_incorporation_date_to | ||
gemi_incorporation_date_to | string | - | Inclusive upper bound for GEMI incorporation date (YYYY-MM-DD); use alone or with gemi_incorporation_date_from | ||
include_total | boolean | false | Include total count |
These date parameters are passed through to the EOA retrieve API as filter.gemiIncorporationDateFrom and filter.gemiIncorporationDateTo (inclusive calendar dates). Profiles without a GEMI incorporation date are excluded when a bound is applied.
Example:
{
"query": "ΠΛΥΤΑΡΙΑΣ",
"license_status": "active",
"page": 1,
"page_size": 20,
"include_total": true
}get_intermediary_by_vatGet a single intermediary by VAT number.
Inputs:
| Parameter | Type | Description |
|---|---|---|
vat | string | Greek VAT number (9 digits) |
Example:
{
"vat": "998368964"
}get_intermediary_by_gemiGet a single intermediary by GEMI registration number.
Inputs:
| Parameter | Type | Description |
|---|---|---|
gemi | string | GEMI (ΓΕ.ΜΗ.) registration number |
Example:
{
"gemi": "69583903000"
}search_intermediaries_in_bboxSearch within a geographic bounding box.
Inputs:
| Parameter | Type | Description | ||
|---|---|---|---|---|
latitude_from | number | Minimum latitude | ||
latitude_to | number | Maximum latitude | ||
longitude_from | number | Minimum longitude | ||
longitude_to | number | Maximum longitude | ||
query | string | Optional name filter | ||
keee_categories | string[] | Optional | ||
license_status | "active" \ | "expired" \ | "no_info" | Optional |
main_activity | "any" \ | "main" \ | "secondary" | Optional |
legaltype_ids | string[] | Optional | ||
gemi_incorporation_date_from | string | Optional; inclusive YYYY-MM-DD lower bound for GEMI incorporation date | ||
gemi_incorporation_date_to | string | Optional; inclusive YYYY-MM-DD upper bound for GEMI incorporation date | ||
page | number | Default 1 | ||
page_size | number | Default 20, max 50 | ||
order_by | string[] | Optional | ||
include_total | boolean | Default false |
Example:
{
"latitude_from": 37.96,
"latitude_to": 38.00,
"longitude_from": 23.71,
"longitude_to": 23.75,
"include_total": true
}list_legal_typesReturns the mapping of legal type IDs to Greek descriptions. No inputs.
Example response:
{
"results": {
"1": "ΑΕ",
"2": "ΟΕ",
"4": "ΕΕ",
...
},
"source_note": "EOA public registry aggregation; check lastUpdate for freshness.",
"errors": []
}All search tools return:
{
"results": [
{
"profileType": "P|G",
"vatnumber": ".........",
"geminumber": "...",
"agentName": "...",
"gemiTradeName": "...",
"gemiIncorporationDate": "YYYY-MM-DD",
"keeeRegistrationClass": "...",
"keeeLicenceExpiration": "YYYY-MM-DD",
"gemiBusinessAddress": "...",
"gemiPhoneNumber": "...",
"latitude": 0,
"longitude": 0,
"lastUpdate": "ISO-8601"
}
],
"total": 123,
"source_note": "EOA public registry aggregation; check lastUpdate for freshness.",
"errors": []
}total is only present when include_total: true.errors contains any upstream or validation errors.YYYY-MM-DD, from ≤ to)~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.