Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

ANAF SPV

NPM · @FOREVERWORKS/MCP-ANAF-SPV

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

77 Trust /100

Last scanned (10 hours ago)

Scores higher than 55% of npm servers

Category Finance and Payments

Trust breakdown (7 categories)

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. How we score → Why this is hard to score →

Supply Chain Security99
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 7 of 23 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency100
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to foreverworks/mcps). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 1 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability61
  • AI-judged instruction clarity (excellent).Pass
  • 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. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management0
  • Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Tool Safety75
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 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. See how to fix → Fail
  • An AI judge read all 17 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass

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.

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 4 Nov 26 +11
    • Known CVEs: unverified → pass ▲ security
    • Dependency health: unverified → 0.88 ▲ functional
  • 3 Nov 26 66

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 5 Nov 2026 · Analysed npm/@foreverworks/mcp-anaf-spv@0.1.2

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem npm
Reason Verified
Discovered via Registry attestation endpoint
Source repo foreverworks/mcps
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/foreverworks/mcps/.github/workflows/release.yml@refs/tags/release-2026-11-03.2
Rekor log index 3657997487
Predicate type SLSA build provenance https://slsa.dev/provenance/v1
Subject digest sha512:c4f5cb8c2c25e71bf63cdc387190f8e3f0a9fc50fbab699e0e6c1527e20c57db4aa4e0bf9927953b55ee56b1d55c6122f03ebd357e6ab1256638bf514

Background: How many MCP packages publish verified provenance →

Dependencies 23 packages
Packages resolved 23
Stale 7
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 16 exposed · ~3,770 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
await_reply ~189

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.

NameTypeReqDescription
downloadboolean–Save the answer's document to the outbox when it is there.
request_idstringyesThe request_id request_document returned.
save_dirstring–A folder INSIDE the downloads outbox (e.g. "2026-10"); empty means the outbox itself. A path outside it is refused.
wait_secondsinteger–How long to keep checking; 0 checks once.

No output schema declared.

No examples provided.

complete_login ~80

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.

NameTypeReqDescription
codestringyesThe security code from the mail, e.g. 246810.

No output schema declared.

No examples provided.

declaration_status ~312

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.

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

No output schema declared.

No examples provided.

download_message ~151

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.

NameTypeReqDescription
keystringyesThe message's key, from list_messages.
save_dirstring–A folder INSIDE the downloads outbox (e.g. "2026-10"); empty means the outbox itself. A path outside it is refused.

No output schema declared.

No examples provided.

health ~84

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.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_document_types ~192

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.

NameTypeReqDescription
cifstring–The tax id to request for, one of `identities`; default the form's first (the account holder).

No output schema declared.

No examples provided.

list_messages ~329

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.

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

No output schema declared.

No examples provided.

login ~179

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.

NameTypeReqDescription
code_by_handboolean–Do not read the code from the mailbox: stop at awaiting_code and wait for complete_login.
forceboolean–Sign in again even when the stored session still works.

No output schema declared.

No examples provided.

logout ~38

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).

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

posting_dates ~237

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.

NameTypeReqDescription
limitinteger–At most this many alert e-mails read.
sincestring–Alerts received on or after: a calendar date in Bucharest, YYYY-MM-DD, inclusive.
textstring–Only lines whose details contain this phrase (case and diacritics ignored), e.g. D256.
untilstring–Alerts received on or before: a calendar date in Bucharest, YYYY-MM-DD, inclusive.

No output schema declared.

No examples provided.

request_document ~304

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.

NameTypeReqDescription
cifstring–The tax id to request for, one of `identities`; default the form's first (the account holder).
monthinteger–The reporting month, for the types that take one.
month_frominteger–The first month, for the types that take a range (Neconcordante D394).
month_tointeger–The last month of that range.
puistring–The PUI, for the Fisa Rol types.
registration_numberstring–A filing's registration number, for Duplicat Recipisa (e.g. INTERNT-123456789-2026).
typestringyesThe document type, as list_document_types names it (case and diacritics ignored).
yearinteger–The reporting year, for the types that take one (Duplicat declaratie unica: 2025 = the return filed in 2025).

No output schema declared.

No examples provided.

session_status ~70

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).

NameTypeReqDescription
probeboolean–Load one page to prove the session is alive.

No output schema declared.

No examples provided.

submit_contact_form ~471

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.

NameTypeReqDescription
againboolean–Send even though this same message was sent, or tried, before.
attachmentstring–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_sha256string–The attachment's hex SHA-256, as sha256sum prints it; a mismatch fails and nothing is sent.
categoryinteger–The form's category. 3 (the default): "Asistență și îndrumare de specialitate în domeniul fiscal", the one answered on the merits.
cifstringyesThe tax id to write as: one of the form's identities (the dry run lists them). Required: the form preselects the first.
dry_runboolean–true (the default): read the form and check the message, send nothing. false: send it to ANAF.
subcategoryinteger–Only for categories 1, 2 and 5, which require one; the error lists them.
textstringyesThe message. Sent without diacritics (stripped here) and at most 1,500 characters after that; put a longer wording in an attached PDF.

No output schema declared.

No examples provided.

submit_declaration ~390

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.

NameTypeReqDescription
confirmboolean–Must be true: a filed declaration cannot be withdrawn, only rectified.
pdfstringyesThe 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_sha256string–Its hex SHA-256 as validate_declaration answered it; a mismatch fails and nothing is sent.
refileboolean–Send these exact bytes again although they were filed (or sent with no answer) before.
save_dirstring–A folder INSIDE the downloads outbox (e.g. "2026-10"); empty means the outbox itself. A path outside it is refused.
wait_secondsinteger–How long to wait for SPV's RECIPISA (it usually arrives within seconds).

No output schema declared.

No examples provided.

sync_messages ~299

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.

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

No output schema declared.

No examples provided.

validate_declaration ~445

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.

NameTypeReqDescription
formstring–The form: D212; D100, obligations to the state budget; D300, the VAT return; D112, an employer's contributions and withheld tax.
monthinteger–The period's month, checked against the XML's (D212's is 12).
pdfboolean–Also make the filing PDF when the XML is valid.
save_dirstring–A folder INSIDE the downloads outbox (e.g. "2026-10"); empty means the outbox itself. A path outside it is refused.
xmlstringyesThe 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_sha256string–Its hex SHA-256; a mismatch fails before anything runs.
yearinteger–The period's year (D212: the reporting year), checked against the XML's.

No output schema declared.

No examples provided.

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.

npm · @foreverworks/mcp-anaf-spv

# add to Claude Code
claude mcp add com-foreverworks-anaf-spv -- npx -y @foreverworks/mcp-anaf-spv
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.