hilma-mcp
# hilma-mcp
MCP (Model Context Protocol) -serveri Suomen julkisille hankintailmoituksille — [hankintailmoitukset.fi](https://hankintailmoitukset.fi) (Hilma).
Mahdollistaa hankintailmoitusten haun suoraan Claude-assistentista ilman erillistä selainta.
> **Kieliversio:** Ohjeet suomeksi alla. English instructions further down.
---
## Vaatimukset
- [Node.js](https://nodejs.org/) versio 18 tai uudempi
- Claude Desktop tai Claude Cowork (MCP-tuki)
- Hilma AVP API -avain (ks. alla)
---
## Asennus
### 1. Kloonaa repo
```bash
git clone https://github.com/Aimiten/hilma-mcp.git
cd hilma-mcp
```
### 2. Asenna riippuvuudet ja buildaa
```bash
npm install
npm run build
```
Tämä luo `dist/index.js`-tiedoston, jota Claude ajaa.
### 3. Luo .env-tiedosto
```bash
cp .env.example .env
```
Avaa `.env` tekstieditorissa ja lisää API-avaimesi:
```
HILMA_API_KEY=oma-avp-read-avain-tähän
HILMA_READ_API_KEY=oma-avp-read-avain-tähän
```
> **Huom:** Molemmat kentät käyttävät **samaa avainta** — `avp-read`-tuote sisältää jo Read API (EForms) -rajapinnan, joten erillistä tilausta ei tarvita.
Hanki avain ilmaiseksi:
1. Mene osoitteeseen https://hns-hilma-prod-apim.developer.azure-api.net/
2. Rekisteröidy tai kirjaudu → **Products → avp-read → Subscribe**
3. Kopioi Primary key Profile-sivulta
> **Huom:** `.env`-tiedostoa ei koskaan commitoida GitHubiin — se on jo `.gitignore`:ssa.
### 4. Lisää Claude-konfiguraatioon
Avaa Claude Desktopin konfiguraatiotiedosto:
| Käyttöjärjestelmä | Polku |
|-------------------|-------|
| **macOS** | `~/Library/Application Support/Claude/claude_desktop_config.json` |
| **Windows** | `%APPDATA%\Claude\claude_desktop_config.json` |
Lisää tai muokkaa `mcpServers`-osiota:
```json
{
"mcpServers": {
"hilma": {
"command": "node",
"args": ["/ABSOLUUTTINEN/POLKU/hilma-mcp/dist/index.js"]
}
}
}
```
**Tärkeää:** Korvaa `/ABSOLUUTTINEN/POLKU/hilma-mcp` oikealla polulla omalla koneellasi. Esimerkiksi:
- macOS: `/Users/sinunnimesi/hilma-mcp/dist/index.js`
- Windows: `C:\\Users\\sinunnimesi\\hilma-mcp\\dist\\index.js`
### 4. Käynnistä Claude uudelleen
Hilma ilmestyy connectors-listaan uudelleenkäynnistyksen jälkeen.
---
## API-avain
Serveri **vaatii** oman API-avaimen — sitä ei ole bundlattu koodiin tietoturvasyistä.
1. Rekisteröidy ilmaiseksi: https://hns-hilma-prod-apim.developer.azure-api.net/
2. Lisää avain `.env`-tiedostoon (suositeltu):
```
HILMA_API_KEY=oma-avaimesi-tähän
```
3. Tai anna se suoraan Claude-konfiguraatiossa:
```json
{
"mcpServers": {
"hilma": {
"command": "node",
"args": ["/polku/hilma-mcp/dist/index.js"],
"env": {
"HILMA_API_KEY": "oma-avaimesi-tähän"
}
}
}
}
```
---
## Työkalut
| Työkalu | Kuvaus | Vaatii |
|---------|--------|--------|
| `search_notices` | Hae ilmoituksia CPV-koodeilla, hakusanalla, päivämäärällä | HILMA_API_KEY |
| `get_notice_summary` | Yksittäisen ilmoituksen metatiedot noticeId:llä | HILMA_API_KEY |
| `get_expiring_soon` | Ilmoitukset joiden deadline on N päivän sisällä | HILMA_API_KEY |
| `get_notice_full` | Täysi eForms XML + yhteystiedot (BT-502/503/506) | HILMA_READ_API_KEY |
### `search_notices` — Hankintailmoitusten haku
| Parametri | Tyyppi | Kuvaus |
|-----------|--------|--------|
| `search` | string | Vapaatekstihaku. `"*"` = kaikki. |
| `cpv_codes` | string[] | CPV-koodit, esim. `["71200000", "72000000"]`. OR-logiikka. |
| `notice_type` | string | `ContractNotices` / `ContractAwardNotices` / `PlanNotices` |
| `procurement_type` | string | `services` / `works` / `supplies` |
| `procedure_type` | string | `open` / `restricted` / `negotiated` |
| `days` | number | Viimeiset N päivää |
| `hours` | number | Viimeiset N tuntia |
| `top` | number | Max tuloksia (1–100, oletus 20) |
### `get_notice_summary` — Yksittäisen ilmoituksen yhteenveto
| Parametri | Tyyppi | Kuvaus |
|-----------|--------|--------|
| `notice_id` | number | Ilmoituksen numeerinen ID |
Käyttää search-APIa — ei vaadi erillistä tilausta. Palauttaa kaikki metatiedot: tilaaja, deadline, arvo, CPV, portaali-URL.
### `get_expiring_soon` — Lähestyvät deadlinet
| Parametri | Tyyppi | Kuvaus |
|-----------|--------|--------|
| `days` | number | Hae deadlinet seuraavan N päivän sisällä |
| `cpv_codes` | string[] | Rajaa CPV-koodeilla (valinnainen) |
Järjestää tulokset deadlinen mukaan nousevaan järjestykseen.
### `get_notice_full` — Täydet tiedot eForms XML:stä
| Parametri | Tyyppi | Kuvaus |
|-----------|--------|--------|
| `notice_id` | number | Ilmoituksen numeerinen ID |
**Vaatii HILMA_READ_API_KEY** (sama avain kuin HILMA_API_KEY — sisältyy `avp-read`-tilaukseen). Palauttaa:
- Yhteystiedot: BT-502 (nimi), BT-503 (sähköposti), BT-506 (puhelin)
- Tarjousportaalin URL:t
- Koko eForms XML -raakadata
---
## API-viite
Perustuu viralliseen [Hilma API](https://github.com/Hankintailmoitukset/hilma-api) -dokumentaatioon.
- Hakuendpoint: `POST https://api.hankintailmoitukset.fi/avp/eformnotices/docs/search`
- Yksittäinen ilmoitus: `GET https://api.hankintailmoitukset.fi/avp/eformnotices/docs/{noticeId}`
- Autentikointi: `Ocp-Apim-Subscription-Key` -header
---
## English
### Quick install
```bash
git clone https://github.com/Aimiten/hilma-mcp.git
cd hilma-mcp
npm install && npm run build
cp .env.example .env # then add your API key to .env
```
Get a free API key at: https://hns-hilma-prod-apim.developer.azure-api.net/
Add to Claude Desktop config (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS):
```json
{
"mcpServers": {
"hilma": {
"command": "node",
"args": ["/absolute/path/to/hilma-mcp/dist/index.js"]
}
}
}
```
Restart Claude. The Hilma connector will appear in the connectors list.
---
## Lisenssi / License
MIT — ks. [LICENSE](LICENSE).
---
## Aimiten
Tämä MCP-serveri on toteutettu osana **[Aimitenin](https://aimiten.fi)** AI-konsultointia. Aimiten Oy auttaa suomalaisia pk-yrityksiä ottamaan tekoälyn (Claude, Copilot, Gemini, n8n) käytäntöön — koulutus, konsultointi ja kevyet Managed Agents -toteutukset.
- 🌐 **Verkkosivu:** [aimiten.fi](https://aimiten.fi)
- 📖 **Claude Code -opas (suomeksi):** [aimiten.fi/oppaat/claude-ai](https://aimiten.fi/oppaat/claude-ai)
- 🛠️ **MCP-palvelimet & integraatiot:** [aimiten.fi/palvelut](https://aimiten.fi/palvelut)
- 👤 **Tekijät:** Sampsa Sironen (CEO) + Ville Grönlund (Co-Founder)
This MCP server is built and maintained by **[Aimiten](https://aimiten.fi)**, a Finnish AI consultancy specializing in Claude, Copilot, and Gemini integrations for SMEs.
TDQS
Scored across 4 tools
Each tool has a clearly distinct purpose: search_notices for discovery, get_expiring_soon for time-sensitive filtering, get_notice_summary for metadata, and get_notice_full for complete XML data. No overlap or ambiguity between tools.
All tools follow a consistent snake_case verb_noun pattern: get_notice_summary, get_notice_full, search_notices, get_expiring_soon. The naming is predictable and uniform.
With only 4 tools, the server is well-scoped for its purpose of accessing Finnish procurement notices. Each tool earns its place without unnecessary bloat or glaring omissions.
The surface covers the full read-only lifecycle: search for notices, retrieve summaries, retrieve full XML details, and find expiring deadlines. No apparent gaps for the intended use case.