Heu Mcp

io.github.lucavisconti211-debugPublished by GitHub account lucavisconti211-debugv0.1.2Updated Oct 24, 2026

HEU Legal e-signature MCP: manage HEU documents and PDFs, prompt signers, download PDFs.

Overview

AI-generated overview

Local MCP server for HEU Legal e-signature: list, create, read, send for signature, chase and download HEU documents and PDFs from chat.

What you can do
List and inspect HEU native documents and uploaded PDFs, including signers, placeholders and statuses, and check API health with get_heu_health and the list/get tools for both families (native documents and uploaded PDFs). Create documents from templates or upload a local PDF and send it for signature, then prompt signers or cancel a request that has not been signed yet. Read document text in the conversation and extract party data such as VAT numbers, tax codes, SDI, PEC and addresses. Download signed PDFs, audit trails and the full legal bundle ZIP to a local folder. Manage reusable PDF templates: create, update, preview annotated field positions, locate text coordinates and delete.
When to use it
Useful when you handle HEU Legal e-signature workflows and want to drive them from an MCP client: sending contracts or NDAs for signature, chasing signers, summarizing or comparing contracts, extracting party data for Italian e-invoicing, or archiving signed bundles.
Requirements
Python 3.10 or newer and the heu-mcp package from PyPI, run as a local stdio process. A HEU Legal API key in HEU_API_KEY, which requires an Enterprise subscription (at most 2 active keys). Optional HEU_BASE_URL (defaults to the HEU API) and HEU_DOWNLOAD_DIR (defaults to /tmp). Template flows need at least one template on the platform. Network access to the HEU API.
Before you install
The API key in HEU_API_KEY grants access to your HEU account and documents; keep it out of shared configs. Several tools act externally: they create documents, send signature emails, update or delete templates, cancel signature requests and send reminders. FEA signatures consume FEA credits per signer. Downloaded PDFs, audit trails and bundles are written to the local download directory. Document text and party data are sent to the HEU API and returned into the conversation.

Installation

In SourceWeft

  1. Open Heu Mcp in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

HEU Legal MCP Server

[PyPI] [Python] [License: MIT] [MCP Registry]

MCP server (Model Context Protocol) che collega l'API HEU Legal a Claude e a qualsiasi client MCP. Gestisce l'intero ciclo di vita dei documenti con firma elettronica (valida in 180+ paesi) direttamente in conversazione: dalla creazione all'invio in firma, dal sollecito al download del fascicolo legale completo.


Cosa puoi fare

Voglio...Il server lo fa con...
📄 Vedere i miei documenti e templateslist_heu_documents, list_pdf_documents
✍️ Mandare un contratto in firma da un templatecreate_heu_document, create_pdf_document
🚀 Mandare in firma un PDF che ho sul computer, senza passare dalla piattaformacreate_pdf_document_from_upload
🤖 Far mappare i campi firma all'AI (analizza il PDF, posiziona i campi, invia)locate_pdf_text + create_pdf_document_from_upload
🔔 Sollecitare chi non ha ancora firmatoprompt_heu_document_signature, prompt_pdf_document_signature
👀 Far leggere un contratto all'AI (riassunti, clausole, confronti) senza scaricarloread_heu_document, read_pdf_document
🪪 Estrarre i dati delle parti (P.IVA, codice fiscale, SDI, PEC, indirizzi)extract_heu_document_parties, extract_pdf_document_parties
💾 Scaricare il PDF firmatodownload_heu_document_pdf, download_pdf_document
⚖️ Scaricare il fascicolo legale completo (documento + audit trail + artefatti FES)download_pdf_bundle, download_pdf_audit_trail
🧩 Creare/modificare templates PDF riutilizzabili via APIcreate_pdf_template, update_pdf_template, preview_pdf_template, delete_pdf_template
❌ Annullare una richiesta di firma inviata per errorecancel_pdf_document
🩺 Controllare che l'API sia raggiungibileget_heu_health

Due famiglie di oggetti:

  • Documenti nativi HEU — creati con l'editor in-app della piattaforma (ID a forma di UUID, es. 5135e7b2-196b-...).
  • PDF caricati — file PDF con firmatari e campi firma posizionati sopra (ID numerici, es. 68).

Requisiti

  • Python ≥ 3.10
  • API key HEU Legal — nella UI: Profile → API Keys → Generate API Key (richiede subscription Enterprise; massimo 2 chiavi attive)
  • Per i flussi da template: almeno un template creato sulla piattaforma (oppure crealo via API con create_pdf_template)

Installazione

Da PyPI:

bash
pip install heu-mcp

Da sorgenti:

bash
git clone https://github.com/heulegal/heu-mcp.gitcd heu-mcppython3 -m venv venvsource venv/bin/activatepip install -r requirements.txt

Configurazione

Claude Desktop

Modifica ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) o %APPDATA%\Claude\claude_desktop_config.json (Windows):

json
{  "mcpServers": {    "heu": {      "command": "heu-mcp",      "args": [],      "env": {        "HEU_API_KEY": "la_tua_api_key_qui"      }    }  }}

Se installato da sorgenti con venv:

json
{  "mcpServers": {    "heu": {      "command": "/path/assoluto/heu-mcp/venv/bin/python",      "args": ["/path/assoluto/heu-mcp/server.py"],      "env": {        "HEU_API_KEY": "la_tua_api_key_qui"      }    }  }}

Riavvia Claude Desktop dopo la modifica.

Claude Code (CLI)

bash
claude mcp add heu heu-mcp -e HEU_API_KEY=la_tua_api_key_qui

Server remoto (multi-utente)

Oltre alla modalità locale (stdio) descritta sopra, il progetto include un server remoto che espone gli stessi 28 tool via HTTPS, così gli utenti si collegano senza installare nulla: inseriscono la propria API key HEU una volta, in un flusso OAuth.

Caratteristiche:

  • Transport Streamable HTTP, autenticazione OAuth 2.1 con PKCE S256, Dynamic Client Registration e Client ID Metadata Document
  • Multi-utente: ogni connessione usa la API key del proprio utente, conservata cifrata (Fernet) e mai in chiaro nel database
  • Refresh token con rotazione e revoca automatica della sessione in caso di riuso sospetto
  • I/O di rete asincrono e parsing PDF su threadpool: una richiesta lenta non blocca gli altri utenti

Avvio locale

bash
pip install -e ".[remote]"export HEU_MCP_SECRET_KEY="$(python -c 'from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())')"export PUBLIC_URL="http://localhost:8080"export HEU_MCP_DB="./heu-mcp.db"heu-mcp-remote

Deploy su Fly.io

bash
fly launch --no-deployfly volumes create heu_data --size 1fly secrets set HEU_MCP_SECRET_KEY="$(python -c 'from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())')"fly secrets set PUBLIC_URL="https://<nome-app>.fly.dev"fly deploy

Variabili d'ambiente del server remoto

VariabileDescrizioneDefault
HEU_MCP_SECRET_KEYChiave Fernet per cifrare le API key degli utenti (richiesta)—
PUBLIC_URLURL pubblico del servizio, senza slash finale (richiesta in produzione)http://localhost:8080
MCP_PATHPath dell'endpoint MCP/mcp
HEU_MCP_DBPercorso del database SQLite/data/heu-mcp.db
ACCESS_TOKEN_TTL / REFRESH_TOKEN_TTLDurata token in secondi1 ora / 60 giorni

Endpoint esposti

EndpointScopo
/mcpEndpoint MCP (richiede bearer token)
/.well-known/oauth-protected-resourceMetadati risorsa protetta (RFC 9728)
/.well-known/oauth-authorization-serverMetadati authorization server (RFC 8414)
/register · /authorize · /tokenFlusso OAuth 2.1
/healthzLiveness probe

Variabili d'ambiente

VariabileDescrizioneDefault
HEU_API_KEYAPI key HEU Legal (richiesta)—
HEU_BASE_URLURL base dell'APIhttps://api.heulegal.com/v1
HEU_DOWNLOAD_DIRCartella dove salvare i file scaricati/tmp

Riferimento completo dei tool (28)

🩺 Health

ToolParametriCosa ritorna
get_heu_health—{ message: "ok", status: 200 } se l'API è operativa

📄 Documenti nativi HEU

ToolParametriCosa fa
list_heu_documentstype (document/template), sort (asc/desc), created_from + created_to (ISO 8601), have_editors_signed — tutti opzionaliLista documenti/template con stato, membri, firme. ⚠️ Le due date vanno passate sempre insieme, altrimenti l'API può restituire risultati incompleti
get_heu_documentdocument_idDettaglio completo: nome, stato (to_sign/in_progress/in_review/completed/signed), owner, editors, members con has_signed e signed_at, tags
list_heu_document_placeholdersdocument_idElenco delle chiavi placeholder sostituibili nel testo del template
create_heu_document ✋source_document_id, email_subject, email_text, email_to (lista), document_name, document_type, placeholders (mappa chiave→valore)Crea un documento da un template, sostituisce i placeholder e lo condivide via email ai destinatari
prompt_heu_document_signature ✋document_idInvia il sollecito di firma. Limite: 1 ogni 24h per documento (429 con Retry-After se superato)
read_heu_documentdocument_id, pages (es. "1-3", "5", "1,3,5-7"), layout, has_index, has_footerEstrae il testo del documento e lo restituisce in conversazione, senza salvare nulla su disco. Max 100 pagine se pages è omesso
extract_heu_document_partiesdocument_id, pages, include_textDati delle parti: combina i firmatari registrati con l'estrazione dal testo di codici fiscali, P.IVA, codice univoco SDI, email, PEC, luogo+data di nascita, indirizzi, CAP. Pattern ottimizzati per contratti italiani
download_heu_document_pdfdocument_id, layout (codici UI: 100, 200-204, 210-214, 220-224, 230-234), has_index, has_footer, output_pathGenera e salva il PDF su disco; ritorna il path

📎 PDF caricati

ToolParametriCosa fa
list_pdf_documentstype (richiesto: document/template), sortLista PDF con stato (to_sign/in_progress/signed), tipo firma (FES/FEA), firmatari
get_pdf_documentdocument_idDettaglio: nome, stato, signature_type, date, firmatari con has_read/has_signed
list_pdf_document_signersdocument_idFirmatari del PDF: id, nome, email, ha letto, ha firmato
list_pdf_document_signer_placeholdersdocument_id, signer_idCampi (firma/testo/checkbox) assegnati a un firmatario specifico, con posizione e stato di compilazione
list_pdf_document_placeholdersdocument_idTutti i campi del PDF
create_pdf_document ✋source_document_id, email_subject, email_body, signers (con source_id, full_name, email), document_name, signature_type (fes/fea), placeholders precompilabiliCrea un PDF firmabile da un template esistente e invia gli inviti. Con fea servono crediti sufficienti (422 altrimenti)
prompt_pdf_document_signature ✋document_idSollecito di firma per il PDF
read_pdf_documentdocument_id, pagesEstrae il testo del PDF (incluso quello firmato) e lo restituisce in conversazione
extract_pdf_document_partiesdocument_id, pages, include_textDati delle parti (come sopra) per i PDF caricati
download_pdf_documentdocument_id, output_pathScarica il PDF — versione firmata se disponibile — e ritorna il path
download_pdf_audit_traildocument_id, output_pathScarica l'audit trail: il registro PDF di chi ha letto/firmato e quando
download_pdf_bundledocument_id, output_pathScarica lo ZIP del fascicolo legale: PDF firmato + audit trail + artefatti FES. Ideale per archiviazione a valore probatorio
cancel_pdf_document ✋document_idAnnulla una richiesta di firma inviata: il documento sparisce dagli elenchi e i link di firma vengono invalidati. Rifiutato con 409 se qualcuno ha già firmato

🧩 Template PDF (gestione via API)

ToolParametriCosa fa
create_pdf_template ✋file_path (PDF locale ≤ 5 MB), document_name, signers (source_id, full_name), placeholders (tipo, posizione %, pagina)Crea un template riutilizzabile caricando un PDF dal computer. L'ID restituito si usa come source_document_id in create_pdf_document
create_pdf_document_from_upload ✋file_path, document_name, email_subject, email_body, signers (con email), placeholders, signature_typeScorciatoia completa: carica un PDF e lo manda subito in firma, senza creare prima il template. Il documento nasce to_sign e i firmatari ricevono l'email immediatamente
locate_pdf_textfile_path oppure document_id, search_terms (default: parole chiave firma), pages, include_all_linesTrova le coordinate di testi nel PDF (in %, origine in basso a sinistra — lo stesso sistema dei placeholder). È il tool che permette all'AI di posizionare i campi da sola: cerca "Firma", i nomi delle parti o qualsiasi ancora, e ottiene pagina + posizione di ognuna
preview_pdf_templatedocument_id, output_pathScarica un'anteprima annotata: ogni campo è disegnato come riquadro etichettato con tipo e firmatario. Per verificare le posizioni prima dell'invio
update_pdf_template ✋document_id, signers (set completo sostitutivo), placeholders (idem; [] li cancella tutti), document_nameSostituzione integrale di firmatari e campi di un template (l'ID resta invariato). Solo il proprietario
delete_pdf_template ✋document_idElimina (nasconde) il template da tutti gli elenchi

✋ = il tool ha effetti verso l'esterno (crea, invia email, elimina): Claude chiede sempre conferma prima di eseguirlo.

Come si posizionano i placeholder
  • position_x / position_y: percentuale della pagina (0–100 esclusi), origine in basso a sinistra (come nell'editor dell'app).
  • page_number: parte da 1.
  • Tipi: signature, initials, text (richiede text_label), checkbox_optional, checkbox_required.
  • I firmatari si collegano ai campi tramite source_id → signer_source_id.
  • I PDF ruotati (/Rotate 90/180/270) vengono rifiutati dall'API.

Flussi di lavoro tipici

0. Invio in firma "intelligente": l'AI mappa i campi da sola

"Prendi /Users/me/Desktop/Contratto.pdf, trova dove devono firmare le parti e mandalo a [email protected] e [email protected]."

Cosa succede dietro le quinte:

  1. locate_pdf_text analizza il PDF e trova le ancore: le righe "Firma del Cliente" / "Firma del Fornitore" (o i nomi delle parti) con le loro coordinate esatte in percentuale.
  2. Claude propone la mappatura: "Metto il campo firma del cliente a pagina 4, sopra l'etichetta 'Firma del Cliente' (x 17%, y 14%), e quello del fornitore accanto (x 50%, y 14%). Confermi?"
  3. Alla conferma, create_pdf_document_from_upload carica il PDF con i placeholder posizionati e invia le email di firma.
  4. (Opzionale) preview_pdf_template per un controllo visivo se si è passati da un template.

Le coordinate restituite da locate_pdf_text sono già nel sistema dei placeholder HEU (percentuale, origine in basso a sinistra): nessuna conversione necessaria. Per layout complessi si può chiedere l'intera mappa della pagina con include_all_lines=true, o cercare termini specifici (search_terms=["Il Committente", "Il Prestatore"]).

⚠️ Limite: funziona sui PDF con testo. Le scansioni senza OCR non hanno testo estraibile — in quel caso indicare le posizioni manualmente.

1. Mandare in firma un PDF dal computer (tutto via chat)

"Prendi /Users/me/Desktop/NDA.pdf e mandalo in firma a Mario Rossi ([email protected]). Campo firma in basso a destra dell'ultima pagina, oggetto email 'NDA da firmare'."

Claude usa create_pdf_document_from_upload → il documento è creato e Mario riceve subito l'email. Poi:

"Mario ha firmato?" → get_pdf_document "Sollecitalo" → prompt_pdf_document_signature "È firmato, scaricami il fascicolo completo" → download_pdf_bundle

2. Contratti ricorrenti con template

"Crea un template dal file Contratto-tipo.pdf con due firmatari: cliente e fornitore. Firma del cliente a pagina 3 in basso." → create_pdf_template "Fammi vedere l'anteprima per controllare le posizioni" → preview_pdf_template "Ora usalo per mandare il contratto ad ACME srl" → create_pdf_document

3. Analisi documentale (l'AI legge i contratti)

"Riassumi il contratto abc-123 e dimmi durata e condizioni di recesso" → read_heu_document "Confronta le clausole di responsabilità dei contratti X e Y" → due read_heu_document "Estrai i dati delle parti: ragione sociale, P.IVA, SDI, PEC" → extract_heu_document_parties

L'estrazione parti è pensata per l'integrazione con flussi di fatturazione elettronica italiana: il codice univoco SDI e la P.IVA estratti dal contratto possono alimentare direttamente l'anagrafica del gestionale.

4. Monitoraggio e amministrazione

"Quali documenti di luglio non sono ancora stati firmati da tutti?" → list_heu_documents con date + have_editors_signed=false "Annulla la richiesta di firma del PDF 42, l'abbiamo mandata alla persona sbagliata" → cancel_pdf_document


Comportamenti e limiti da conoscere

CosaLimite / comportamento
Rate limit API300 richieste / 5 minuti (header X-RateLimit-* nelle risposte; 429 con Retry-After oltre soglia)
Solleciti firma1 ogni 24 ore per documento
Upload PDFMax 5 MB, application/pdf, non ruotati
Lettura testoMax 100 pagine se pages non è specificato (il payload segnala truncated: true); PDF scansionati senza OCR non hanno testo estraibile
Firma FEARichiede crediti FEA disponibili per ogni firmatario (422 se insufficienti)
list_heu_documents con datePassare sempre entrambe created_from e created_to
Annullamento PDFPossibile solo senza attività di firma (409 altrimenti)
DownloadI binari vengono salvati su disco (HEU_DOWNLOAD_DIR), mai trasmessi nel canale MCP

Stati dei documenti

StatoSignificato
to_signIn attesa di firme
in_progressIn preparazione/modifica
in_reviewIn revisione
completedFlusso completato (non firmato)
signedCompletamente firmato

Sicurezza

  • L'API key è letta solo da variabile d'ambiente: mai nel codice, mai nelle risposte, mai nei log.
  • I tool con effetti esterni (✋) sono istruiti per richiedere sempre conferma esplicita all'utente.
  • I file scaricati restano sul filesystem locale.

Sviluppo

bash
git clone https://github.com/heulegal/heu-mcp.gitcd heu-mcppython3 -m venv venvsource venv/bin/activatepip install -e .
# Avvio manuale per debugHEU_API_KEY=... python server.py

La spec OpenAPI di riferimento è pubblicata su https://api.heulegal.com/v1/specs/v1.yaml (docs interattive: https://api.heulegal.com/v1/docs).

Licenza

MIT — vedi LICENSE.

Link

Source: README.md at commit d4a94a7

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v0.1.2LatestSep 16, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts