# ANAF SPV (npm · @foreverworks/mcp-anaf-spv)

Download what ANAF posts to your SPV inbox, request documents, and validate or file declarations.

- Trust score: 77/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- npm · `@foreverworks/mcp-anaf-spv`: 77/100 (this document), [markdown](https://verifymcp.io/servers/com-foreverworks-anaf-spv/foreverworks-mcp-anaf-spv.md), [page](https://verifymcp.io/servers/com-foreverworks-anaf-spv/foreverworks-mcp-anaf-spv)

## Channel facts

- Registry: `npm`
- Package: `@foreverworks/mcp-anaf-spv`
- Version: `0.1.2`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Supply Chain Security**: 99/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - 7 of 23 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 100/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to foreverworks/mcps).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 1 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 61/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 3934 tokens (~245/item across 16 items; 16 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Tool Safety**: 75/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - 0 of 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "submit_contact_form" implies "send" and declares no destructiveHint at all, which the MCP spec reads as destructive by default.
  - An AI judge read all 17 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the ANAF SPV MCP server?

ANAF SPV runs locally as an npm package, launched with npx -y @foreverworks/mcp-anaf-spv. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add com-foreverworks-anaf-spv -- npx -y @foreverworks/mcp-anaf-spv
```

### Cursor

```json
{
  "mcpServers": {
    "com-foreverworks-anaf-spv": {
      "command": "npx",
      "args": [
        "-y",
        "@foreverworks/mcp-anaf-spv"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "com-foreverworks-anaf-spv": {
      "command": "npx",
      "args": [
        "-y",
        "@foreverworks/mcp-anaf-spv"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add com-foreverworks-anaf-spv -- npx -y @foreverworks/mcp-anaf-spv
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-foreverworks-anaf-spv": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@foreverworks/mcp-anaf-spv"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add com-foreverworks-anaf-spv --command npx --arg -y --arg @foreverworks/mcp-anaf-spv
```

### Hermes

```yaml
mcp_servers:
  com-foreverworks-anaf-spv:
    command: "npx"
    args: ["-y", "@foreverworks/mcp-anaf-spv"]
```

### Netclaw

```json
{
  "McpServers": {
    "com-foreverworks-anaf-spv": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "@foreverworks/mcp-anaf-spv"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add com-foreverworks-anaf-spv -t stdio -c npx -a -y @foreverworks/mcp-anaf-spv
```

### Other

```json
{
  "mcpServers": {
    "com-foreverworks-anaf-spv": {
      "command": "npx",
      "args": [
        "-y",
        "@foreverworks/mcp-anaf-spv"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-04 (score 77, +11)

- [security improvement] Known CVEs: unverified → pass
- [functional improvement] Dependency health: unverified → 0.88

### 2026-11-03 (score 66)

First indexed and scored.

## MCP tools (16)

### `await_reply` (~189 tokens)

Wait for a request's reply

Wait for SPV's answer to a request_document (a RASPUNS SOLICITARE message carrying its id), checking the list every few seconds for up to wait_seconds. SPV usually answers within two minutes. With download, the answer's document is saved to the outbox as download_message saves it. answered: false means not yet; call again. A client that asks for progress hears the seconds waited; cancelling ends the wait.

Input parameters:

- `download` (boolean): Save the answer's document to the outbox when it is there.
- `request_id` (string, required): The request_id request_document returned.
- `save_dir` (string): A folder INSIDE the downloads outbox (e.g. "2026-10"); empty means the outbox itself. A path outside it is refused.
- `wait_seconds` (integer): How long to keep checking; 0 checks once.

### `complete_login` (~80 tokens)

Complete sign-in

Finish a sign-in that waits for its code (login answered awaiting_code, or a tool failed with needs_login): pass the digits of the newest "Cod de siguranta" mail. SPV honours a code for five minutes; only the newest code works.

Input parameters:

- `code` (string, required): The security code from the mail, e.g. 246810.

### `declaration_status` (~312 tokens)

A filing's status

A filed declaration's state at ANAF and its receipt (recipisa), by its number, from ANAF's public status service (StareD112): no sign-in, nothing changes. The number is the index de încărcare a RECIPISA prints (the middle of its registration number INTERNT-<index>-<year>, also accepted), or the index de depunere submit_declaration answered. Answers status (processing, not_registered, validation_errors, valid) with ANAF's words, the form, the registration number and dates, and saves the signed receipt to the outbox while ANAF serves it (60 days after filing). The service lists a tax id's last 200 filings of the last three months; for an older one it says how to ask SPV for a duplicate. Any form filed electronically, whoever filed it.

Input parameters:

- `cif` (string): The CNP or CUI it was filed for; default the one this server filed it for, when it did.
- `receipt` (boolean): Save the receipt's signed PDF to the outbox when ANAF still serves it.
- `reference` (string, required): The index de încărcare (digits), the registration number INTERNT-<index>-<year>, or submit_declaration's index de depunere.
- `save_dir` (string): A folder INSIDE the downloads outbox (e.g. "2026-10"); empty means the outbox itself. A path outside it is refused.

### `download_message` (~151 tokens)

Download a message

Download one message's document (a signed PDF, as SPV serves it) into the downloads outbox, named <posted date>_<type>_<SPV's file name>. Answers the path, size and SHA-256. Saving the same bytes again finds them there (already_there) instead of writing a copy. A file SPV names for another message (another request's id) is refused as wrong_document and not saved.

Input parameters:

- `key` (string, required): The message's key, from list_messages.
- `save_dir` (string): A folder INSIDE the downloads outbox (e.g. "2026-10"); empty means the outbox itself. A path outside it is refused.

### `health` (~84 tokens)

Health

Whether this server can work: where the SPV credential comes from (a vault MCP, a file, or none), which mail driver reads the e-mailed code (google, text, auto or manual), whether a session is stored and whether a sign-in waits for its code. No network: it never signs in. Run it first, and before concluding the server is broken.

### `list_document_types` (~192 tokens)

Document types

What SPV lets this account request ("Solicitări"), read from the live form: the identities it may request for, and for one of them every document type with the fields it requires or accepts (year, month, registration_number, pui). Among a person's: Obligatii de plata (the statement of what is owed), Nota obligatiilor de plata, Istoric declaratii PF, Duplicat declaratie unica (year), Duplicat Recipisa (registration_number), Venituri Formular Banca, Interogari Banci, certificates. For a person's CNP, the types SPV makes only for a company (Notificare, and any it has refused that way before) are left out of types and listed under cui_only.

Input parameters:

- `cif` (string): The tax id to request for, one of `identities`; default the form's first (the account holder).

### `list_messages` (~329 tokens)

List messages

SPV's message list ("Mesaje"): every document ANAF has put in the taxpayer's virtual space and not yet archived, newest first: decisions, summonses (SOMATII), notifications, payment confirmations (PLATA), receipts, and the answers to requests (RASPUNS SOLICITARE, with the request's id). Each has a `key` for download_message, the time SPV posted it (deadlines usually run from there) and the time it will be archived, after which it can no longer be downloaded. `types` counts every type in the whole list.

Input parameters:

- `cif` (string): Only documents for this tax id (a CNP or a CUI), for an account that holds several.
- `limit` (integer): At most this many items; `more` says how many were left out.
- `request_id` (string): Only the answer to this request (request_document's request_id).
- `since` (string): Posted on or after: a calendar date in Bucharest, YYYY-MM-DD, inclusive.
- `text` (string): Only messages whose details contain this phrase (case and diacritics ignored).
- `type` (string): Only this SPV document type, as list_messages' `types` names it: DECIZIE, SOMATII, NOTIFICARE, RASPUNS SOLICITARE, PLATA, RECIPISA, ... (case and diacritics ignored).
- `until` (string): Posted on or before: a calendar date in Bucharest, YYYY-MM-DD, inclusive.

### `login` (~179 tokens)

Sign in

Sign in to SPV now. Rarely needed: every tool signs in by itself when the session is missing or has ended. The server reads the password from its credential source, SPV e-mails a security code, and the mail driver reads it from the mailbox; the answer says signed_in. When no mail driver can read it (manual, or the code did not come in time) the answer says awaiting_code with a deadline: read the newest "Cod de siguranta" mail from Autentificare.SpatiuPrivat@anaf.ro and pass its digits to complete_login. Each sign-in e-mails the user a code.

Input parameters:

- `code_by_hand` (boolean): Do not read the code from the mailbox: stop at awaiting_code and wait for complete_login.
- `force` (boolean): Sign in again even when the stored session still works.

### `logout` (~38 tokens)

Sign out

Sign out at SPV and forget the session here. The next tool that needs SPV signs in again (and SPV e-mails a new code).

### `posting_dates` (~237 tokens)

When SPV posted documents

When SPV posted documents, from its alert e-mails ("Documente noi SPV" from Portal.ANAF@anaf.ro) in the mailbox its sign-in codes go to: per line the document (with its form, e.g. D256), the day ANAF processed it ("prelucrata la") and when the alert arrived, newest first. SPV drops most documents about two months after posting them, and an act posted there counts as communicated on the day it was made available, so for an archived document these alerts are the lasting record of that date. Reads mail only, never SPV. details matches list_messages' details for a document still listed.

Input parameters:

- `limit` (integer): At most this many alert e-mails read.
- `since` (string): Alerts received on or after: a calendar date in Bucharest, YYYY-MM-DD, inclusive.
- `text` (string): Only lines whose details contain this phrase (case and diacritics ignored), e.g. D256.
- `until` (string): Alerts received on or before: a calendar date in Bucharest, YYYY-MM-DD, inclusive.

### `request_document` (~304 tokens)

Request a document

Ask SPV for a document, as its "Solicitări" form does. SPV registers the request (the answer carries its request_id) and posts the document as a RASPUNS SOLICITARE message a minute or two later: call await_reply with the id. The type must be one list_document_types offers this identity, with the fields it requires; a field the type does not take is refused before anything is sent. Free, and changes nothing at ANAF.

Input parameters:

- `cif` (string): The tax id to request for, one of `identities`; default the form's first (the account holder).
- `month` (integer): The reporting month, for the types that take one.
- `month_from` (integer): The first month, for the types that take a range (Neconcordante D394).
- `month_to` (integer): The last month of that range.
- `pui` (string): The PUI, for the Fisa Rol types.
- `registration_number` (string): A filing's registration number, for Duplicat Recipisa (e.g. INTERNT-123456789-2026).
- `type` (string, required): The document type, as list_document_types names it (case and diacritics ignored).
- `year` (integer): The reporting year, for the types that take one (Duplicat declaratie unica: 2025 = the return filed in 2025).

### `session_status` (~70 tokens)

Session status

Is a session stored, since when, and when it last worked; with probe, loads one SPV page to prove SPV still honours it. Never signs in (every other tool signs in by itself when it needs to).

Input parameters:

- `probe` (boolean): Load one page to prove the session is alive.

### `submit_contact_form` (~471 tokens)

Write to ANAF (contact form)

Send a message through SPV's contact form ("Formular de contact"): a question or request about the taxpayer's own record, registered at ANAF under the account's name and answered later in SPV as RASPUNS SESIZARE FORMULAR UNIC DE CONTACT. By default a DRY RUN: it reads the live form, checks the message against it and answers it exactly as it would go (identity, category, text without diacritics, attachment with its SHA-256), sending nothing. With dry_run: false it sends, once: it answers the registration number, the date and the text SPV shows. The form preselects its first identity, often a company, so cif is required and read back. The same message is not sent twice unless again: true.

Input parameters:

- `again` (boolean): Send even though this same message was sent, or tried, before.
- `attachment` (string): A file to attach (pdf, tiff, rtf, zip, jpeg, jpg, gif, png, at most 10 MB): a file in your workspace folders (the roots this client shares with the server; without them /workdir); a bare name is take…
- `attachment_sha256` (string): The attachment's hex SHA-256, as sha256sum prints it; a mismatch fails and nothing is sent.
- `category` (integer): The form's category. 3 (the default): "Asistență și îndrumare de specialitate în domeniul fiscal", the one answered on the merits.
- `cif` (string, required): The tax id to write as: one of the form's identities (the dry run lists them). Required: the form preselects the first.
- `dry_run` (boolean): true (the default): read the form and check the message, send nothing. false: send it to ANAF.
- `subcategory` (integer): Only for categories 1, 2 and 5, which require one; the error lists them.
- `text` (string, required): The message. Sent without diacritics (stripped here) and at most 1,500 characters after that; put a longer wording in an attached PDF.

### `submit_declaration` (~390 tokens)

File a declaration

File a D212 with ANAF at formularespv-pf, in the account holder's name: the PDF validate_declaration made, and only that (its SHA-256, size and embedded XML are checked against what was validated). Signs in to formularespv-pf by itself (its own session; SPV e-mails a code), uploads, and answers the index de depunere; then waits for SPV's RECIPISA and downloads it with the DECLARATIE. A filed declaration is a fiscal document: it cannot be withdrawn, only rectified. Requires confirm: true; the same bytes are filed once unless refile. A D100, D300 or D112 PDF is checked and refused as unsupported before anything is sent: ANAF takes those only through e-guvernare.ro, signed with a qualified certificate. Moves money or makes a legal document: the client asks the user to approve each call.

Input parameters:

- `confirm` (boolean): Must be true: a filed declaration cannot be withdrawn, only rectified.
- `pdf` (string, required): The filing PDF validate_declaration made: a file in your workspace folders (the roots this client shares with the server; without them /workdir); a bare name is taken from the first. Taken by path on…
- `pdf_sha256` (string): Its hex SHA-256 as validate_declaration answered it; a mismatch fails and nothing is sent.
- `refile` (boolean): Send these exact bytes again although they were filed (or sent with no answer) before.
- `save_dir` (string): A folder INSIDE the downloads outbox (e.g. "2026-10"); empty means the outbox itself. A path outside it is refused.
- `wait_seconds` (integer): How long to wait for SPV's RECIPISA (it usually arrives within seconds).

### `sync_messages` (~299 tokens)

Save every new message

Download every message this server has not saved before (oldest first) and remember it, so a scheduled call keeps a complete archive: SPV drops most documents about two months after posting them. Filters narrow what is synced; `limit` caps one call and `remaining` says how many are left for the next. Answers what was saved, with paths and SHA-256. A client that asks for progress hears each document saved; cancelling stops between documents, and the next sync carries on from there.

Input parameters:

- `cif` (string): Only documents for this tax id (a CNP or a CUI), for an account that holds several.
- `limit` (integer): At most this many downloads in this call.
- `save_dir` (string): A folder INSIDE the downloads outbox (e.g. "2026-10"); empty means the outbox itself. A path outside it is refused.
- `since` (string): Posted on or after: a calendar date in Bucharest, YYYY-MM-DD, inclusive.
- `type` (string): Only this SPV document type, as list_messages' `types` names it: DECIZIE, SOMATII, NOTIFICARE, RASPUNS SOLICITARE, PLATA, RECIPISA, ... (case and diacritics ignored).
- `until` (string): Posted on or before: a calendar date in Bucharest, YYYY-MM-DD, inclusive.

### `validate_declaration` (~445 tokens)

Validate a declaration

Validate a declaration's XML with ANAF's own validator for its form and period (DUKIntegrator with the "soft J" jars of ANAF's package for that period, kept in a cache; D212 for reporting years 2020, 2021, 2022, 2023, 2024, 2025; D100 for periods from 01.2024; D300 for periods from 05.2024; D112 for periods from 01.2025), and answer its errors verbatim, with the period, the taxpayer and what it makes payable. With pdf (the default) a valid XML also becomes the filing PDF, saved to the outbox only once its embedded XML is checked to be the validated file byte for byte. D212's period is its reporting year, an_r (2023 declares 2022's income). Files nothing: submit_declaration files a D212; ANAF takes D100, D300 and D112 only through e-guvernare.ro, signed with a qualified certificate, and the answer says so.

Input parameters:

- `form` (string): The form: D212; D100, obligations to the state budget; D300, the VAT return; D112, an employer's contributions and withheld tax.
- `month` (integer): The period's month, checked against the XML's (D212's is 12).
- `pdf` (boolean): Also make the filing PDF when the XML is valid.
- `save_dir` (string): A folder INSIDE the downloads outbox (e.g. "2026-10"); empty means the outbox itself. A path outside it is refused.
- `xml` (string, required): The declaration's XML: a file in your workspace folders (the roots this client shares with the server; without them /workdir); a bare name is taken from the first. Taken by path only, byte for byte.
- `xml_sha256` (string): Its hex SHA-256; a mismatch fails before anything runs.
- `year` (integer): The period's year (D212: the reporting year), checked against the XML's.

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/com-foreverworks-anaf-spv/foreverworks-mcp-anaf-spv#diagnostics

## Score history

- 2026-11-05: 77
- 2026-11-04: 77
- 2026-11-03: 66

## Common questions

### What is the ANAF SPV MCP server?

ANAF SPV is an MCP server listed in the public MCP registry as com.foreverworks/anaf-spv. Download what ANAF posts to your SPV inbox, request documents, and validate or file declarations. This page covers its npm package (@foreverworks/mcp-anaf-spv).

### Is the ANAF SPV MCP server safe to use?

ANAF SPV scores 77 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the ANAF SPV MCP server expose?

ANAF SPV exposes 16 tools: await_reply, complete_login, declaration_status, download_message, health, and 11 more. Their descriptions and schemas cost roughly 3,770 tokens of context every time the server is loaded.

### Is the ANAF SPV MCP server still maintained?

ANAF SPV is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the ANAF SPV MCP server under?

ANAF SPV declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

### What did VerifyMCP test on the ANAF SPV MCP server?

VerifyMCP ran 15 checks on ANAF SPV, covering Malware scan, Known CVEs, Install scripts, Dependency health and 11 more. One item could not be completed, a gap on our side rather than a finding about ANAF SPV: Stability. One category scores 0 for that reason, because we only credit what we can confirm. Endpoint Security and Transport & Reachability do not apply to an npm package, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.

## Links

- npm package: https://www.npmjs.com/package/@foreverworks/mcp-anaf-spv
- Socket report: https://socket.dev/npm/package/@foreverworks/mcp-anaf-spv
- Repository: https://github.com/foreverworks/mcps
- Website: https://foreverworks.github.io/mcps/servers/anaf-spv/
- Changelog RSS feed: https://verifymcp.io/servers/com-foreverworks-anaf-spv/foreverworks-mcp-anaf-spv.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-foreverworks-anaf-spv/foreverworks-mcp-anaf-spv/changelog.json
- Trust report (JSON): https://verifymcp.io/servers/com-foreverworks-anaf-spv/foreverworks-mcp-anaf-spv.json
- HTML version of this page: https://verifymcp.io/servers/com-foreverworks-anaf-spv/foreverworks-mcp-anaf-spv
