Description
GoCertius MCP Server





MCP server for GoCertius: certified evidence, dossiers, notifications and chats via AI agents.
Quick start
npx -y @g-digital/mcp-gocertius
Or see ONBOARDING.md for a step-by-step setup guide (≤ 5 minutes).
Where to install
This MCP is published to every major MCP distribution channel by the npmjs.com/package/@g-digital/mcp-gocertius |
| Docker Hub | docker pull gdigital/gocertius:latest — hub.docker.com/r/gdigital/gocertius |
| MCP Official Registry | Auto-discovered as io.github.g-digital-by-Garrigues/gocertius — registry.modelcontextprotocol.io |
| n8n community node | Install @g-digital/n8n-nodes-gocertius in n8n Settings → Community Nodes — npmjs.com/package/@g-digital/n8n-nodes-gocertius |
| Smithery | smithery mcp install g-digital/gocertius — smithery.ai/servers/g-digital/gocertius |
Every channel ships the same MCP server contract; the tools and environment configuration below apply regardless of which install path you choose.
> Need credentials? Visit: https://www.gocertius.io
Installation
Claude Desktop
{
"mcpServers": {
"gocertius": {
"args": [
"-y",
"@g-digital/mcp-gocertius"
],
"command": "npx",
"env": {
"MCPAPIBASE_URL": "https://api-gocertius.gocertius.io",
"MCPAUTHUSERKEY": "MCPAUTHUSERKEYHERE>"
}
}
}
}
> Need credentials? See: https://www.gocertius.io
Claude Code (CLI)
{
"mcpServers": {
"gocertius": {
"args": [
"-y",
"@g-digital/mcp-gocertius"
],
"command": "npx",
"env": {
"MCPAPIBASE_URL": "https://api-gocertius.gocertius.io",
"MCPAUTHUSERKEY": "MCPAUTHUSERKEYHERE>"
}
}
}
}
> Need credentials? See: https://www.gocertius.io
Cursor
{
"mcpServers": {
"gocertius": {
"args": [
"-y",
"@g-digital/mcp-gocertius"
],
"command": "npx",
"env": {
"MCPAPIBASE_URL": "https://api-gocertius.gocertius.io",
"MCPAUTHUSERKEY": "MCPAUTHUSERKEYHERE>"
}
}
}
}
> Need credentials? See: https://www.gocertius.io
Windsurf
{
"mcpServers": {
"gocertius": {
"args": [
"-y",
"@g-digital/mcp-gocertius"
],
"command": "npx",
"env": {
"MCPAPIBASE_URL": "https://api-gocertius.gocertius.io",
"MCPAUTHUSERKEY": "MCPAUTHUSERKEYHERE>"
}
}
}
}
> Need credentials? See: https://www.gocertius.io
Cline
{
"mcpServers": {
"gocertius": {
"args": [
"-y",
"@g-digital/mcp-gocertius"
],
"command": "npx",
"env": {
"MCPAPIBASE_URL": "https://api-gocertius.gocertius.io",
"MCPAUTHUSERKEY": "MCPAUTHUSERKEYHERE>"
}
}
}
}
> Need credentials? See: https://www.gocertius.io
VS Code
{
"servers": {
"gocertius": {
"args": [
"-y",
"@g-digital/mcp-gocertius"
],
"command": "npx",
"env": {
"MCPAPIBASE_URL": "https://api-gocertius.gocertius.io",
"MCPAUTHUSERKEY": "MCPAUTHUSERKEYHERE>"
}
}
}
}
> Need credentials? See: https://www.gocertius.io
JetBrains
{
"mcpServers": {
"gocertius": {
"args": [
"-y",
"@g-digital/mcp-gocertius"
],
"command": "npx",
"env": {
"MCPAPIBASE_URL": "https://api-gocertius.gocertius.io",
"MCPAUTHUSERKEY": "MCPAUTHUSERKEYHERE>"
}
}
}
}
> Need credentials? See: https://www.gocertius.io
Zed
{
"mcpServers": {
"gocertius": {
"args": [
"-y",
"@g-digital/mcp-gocertius"
],
"command": "npx",
"env": {
"MCPAPIBASE_URL": "https://api-gocertius.gocertius.io",
"MCPAUTHUSERKEY": "MCPAUTHUSERKEYHERE>"
}
}
}
}
> Need credentials? See: https://www.gocertius.io
Claude Desktop / Claude Code
Add to your ~/.claude.json or claudedesktopconfig.json:
{
"mcpServers": {
"gocertius": {
"command": "npx",
"args": ["-y", "@g-digital/mcp-gocertius"],
"env": {
"MCPAUTHUSER_KEY": "your-user-key",
"MCPAPIBASE_URL": "https://api-gocertius.gocertius.io"
}
}
}
}
Docker
docker run --rm -i
-e MCPAUTHUSER_KEY=your-user-key
-e MCPAPIBASE_URL=https://api-gocertius.gocertius.io
gdigital/gocertius:latest
Environment Variables
| Name | Required | Secret | Description |
| — | — | — | — |
| MCPALLOWINSECUREFILEURL | No | No | Set to “true” to allow plain http:// fileUrl downloads in evidence_create (default https-only). Private/internal addresses are rejected regardless (resolution-time check; see the documented DNS TOCTOU limitation in the hosted-deployment runbook). |
| MCPALLOWUNVERIFIEDBEARER | No | No | Escape hatch for MCPHTTP_PUBLIC=true WITHOUT inbound-token introspection: set to “true” ONLY when an upstream gateway already verifies Bearer tokens. The server logs a prominent warning and forwards tokens upstream unverified. |
| MCPALLOWEDHOSTS | No | No | Comma-separated allowed Host headers. Empty = Host validation disabled (default). When set, requests with a Host outside the list are rejected. |
| MCPALLOWEDORIGINS | No | No | Comma-separated allowed browser Origins (DNS-rebinding defense). Empty = reject any request carrying an Origin header; non-browser clients (CLI/SDK) send no Origin and are always allowed. Use ‘*’ to allow all. |
| MCPAPIBASE_URL | Yes | No | Upstream API root. Required: your user key is exchanged for a session token against this host, and the server will not start without it. |
| MCPAUTHUSER_KEY | Yes | Yes | Long-lived GoCertius user key, exchanged automatically for a short-lived session token. Use it for headless or automated access instead of an account password. (See https://www.gocertius.io for credential acquisition.) |
| MCPHTTPHOST | No | No | Interface the HTTP transport binds to. Default 127.0.0.1 (localhost only). Set 0.0.0.0 to expose on all interfaces (containers do this automatically). |
| MCPHTTPMAXBODYBYTES | No | No | Maximum accepted POST /mcp request-body size in bytes (default 16777216 = 16 MiB — sized so base64 file uploads within the documented tool limits fit). Oversized requests get a 413 JSON-RPC error before/while reading — closes a memory-exhaustion DoS vector in public deployments. Note: base64 file sources are capped by this limit BEFORE MCPFILEMAX_BYTES applies. |
| MCPHTTPPUBLIC | No | No | Set to “true” for public/multi-tenant deployments. Activates Host validation and refuses to start unless (1) MCPALLOWEDORIGINS or MCPALLOWEDHOSTS is set AND (2) inbound Bearer introspection is configured (MCPSVCINTROSPECTURL + MCPSVCCLIENTID/SECRET) or MCPALLOWUNVERIFIED_BEARER=true is set explicitly (fail-closed). |
| MCPSVCCLIENTID | No | No | Client ID this server presents to the introspection endpoint above (its resource-server credentials). Only needed alongside MCPSVCINTROSPECTURL; it does not authenticate you to GoCertius. |
| MCPSVCCLIENTSECRET | No | Yes | Client secret this server presents to the introspection endpoint above (its resource-server credentials). Only needed alongside MCPSVCINTROSPECTURL; it does not authenticate you to GoCertius. (See https://www.gocertius.io for credential acquisition.) |
| MCPSVCINTROSPECTURL | No | No | RFC 7662 token introspection URL for inbound Bearer verification in HTTP mode. Opt-in, and required when MCPHTTP_PUBLIC=true. Leave empty for stdio (local) use. |
| PORT | No | No | HTTP port when running in hosted (HTTP) mode; ignored in stdio mode |
| Variable | Required | Description |
|—|—|—|
| MCPAUTHUSER_KEY | Required | Long-lived user key (exchanged for a session token) |
| MCPOTELENABLED | Optional | Set to true to enable OpenTelemetry tracing |
| MCPAPIBASE_URL | Required | Upstream API root. The user-key exchange authenticates against it, so the server does not start without it |
Bundled Skills
This package ships Claude Code slash-commands under .claude/commands/. After install, invoke them from Claude Code:
/getting-started— step-by-step workflow guide/evidence-lifecycle— step-by-step workflow guide/dossier-lifecycle— step-by-step workflow guide/notification-lifecycle— step-by-step workflow guide/notification-attachments— step-by-step workflow guide/chat-lifecycle— step-by-step workflow guide- Skill:
.claude/skills/gocertius-suite-api/SKILL.md— open this repo in Claude Code and it is available directly. - As a reference: docs/api-integration-skill.md.
See docs/agent-prompts.md for end-to-end prompt examples and the tool sequences they trigger.
Prefer to code against the REST API directly?
You don’t have to go through this MCP server. This repo also ships a Claude Code skill — a standalone integration guide (authentication, call ordering, options, enums, gotchas) for programming directly against the REST API:
It is independent of the MCP tools and the n8n node — pick whichever entry point fits your integration.
Available Tools
This server exposes 62 tools:
| Tool | Description |
|——|————-|
| evidencecreate | Registers a NEW evidence record inside an evidence group. Requires: evidencegroupcreate → evidenceGroupId, casefilecreate → caseFileId. Generate a UUID v4 for id and compute the SHA-256 hex hash BEFORE calling. INTERNAL flow: call with custodyType INTERNAL; the response returns uploadFileUrl (presigned S3 URL). PUT the exact file bytes to uploadFileUrl, then verify with evidenceget/evidencelist, and ONLY THEN call evidenceseal. Do not seal while any INTERNAL evidence file is not uploaded. EXTERNAL flow: use custodyType EXTERNAL only for intentional hash-only evidence; each evidence still needs a fresh UUID. If a previous evidence create/upload failed and outcome is unknown, verify with evidence_list before retrying and do not reuse the same id unless you confirmed it was not persisted. WARNING: the API sometimes returns {code:’EvidenceCreateError’} even when the evidence was successfully persisted. |
| evidence_list | Lists all evidence records in a specific evidence group. Use to review uploaded documents before sealing the group, or to find a specific evidenceId. Requires: caseFileId and evidenceGroupId. Returns paginated list with IDs, titles, status, and timestamps. |
| evidenceseal | Seals an evidence group and triggers qualified TSP timestamping. Requires: all INTERNAL evidence records in the group have already been uploaded to their uploadFileUrl and verified with evidenceget/evidencelist. Requires casefilecreate → caseFileId and evidencegroupcreate → evidenceGroupId. Set evidencesCount to the number of evidences in the group. ASYNC: after calling, poll evidencegroup_list until the group status changes to CLOSED before linking to a dossier or generating certificates. |
| evidenceget | Retrieves a specific evidence record. Requires: evidencecreate → evidenceId, evidencegroupcreate → evidenceGroupId, casefilecreate → caseFileId. Returns status (COMPLETED|IN_PROCESS|ERROR), hash, and tspTimestamp when certified. |
| evidencegroupcreate | Creates an evidence group inside a case file. Requires: casefilecreate → caseFileId. Generate a UUID v4 for id. Set evidenceType to FILE, PHOTO, VIDEO, or WEB_PLUGIN. Returns evidenceGroupId. One group can contain multiple evidence records. |
| evidencegrouplist | Lists all evidence groups in a case file with their current status (OPEN, CLOSING, CLOSED). Use to find an existing group or check which groups are ready for sealing. Requires: caseFileId. |
| dossiercreate | Creates a dossier to aggregate certified evidence groups into a single tamper-evident PDF. Requires: casefilecreate → caseFileId. Evidence groups must be in CLOSED status before linking. Generate a UUID v4 string for id. Returns dossierId. After creation, link evidence with dossierevidencelink, then certify with dossiercertify. |
| dossierupdate | Updates the metadata of an existing dossier (name, template fields, expiry). Requires: dossiercreate → dossierId, caseFileId. Only available while dossier is in DRAFT status. |
| dossiercertify | Certifies a dossier, generating a tamper-evident PDF and locking all linked evidence. Requires: dossiercreate → dossierId, dossierevidencelink (evidence linked), casefilecreate → caseFileId. ASYNC: transitions DRAFT → CERTIFYING → CERTIFIED. Poll dossier_list until dossierId status === CERTIFIED before downloading. |
| dossier_list | Lists all dossiers in a case file with their status and metadata. Use to find an existing dossierId or monitor certification progress. Requires: caseFileId. Returns paginated list with IDs, names, status, and creation dates. |
| dossierlistbyuser | Lists every dossier belonging to a user, across all of their case files. Requires: userId (from sessionlogin or sessioninfo). Use this when you do not know which case file a dossier is in; use dossierlist when you already have a caseFileId. Supports filter, order and page. Returns { data, meta.totalElements }. |
| dossier_get | Retrieves the full details of a specific dossier including status, linked evidence, and download URLs. Use to check current state or get certificate download URLs after CERTIFIED. Requires: caseFileId and dossierId. |
| dossiertemplatelist | Lists available dossier templates. No prerequisites. Returns template IDs and their translations per language. Use the returned id as dossierTemplateId in dossier_create. |
| dossier_preview | Returns an HTML preview URL of a dossier before certification. Requires: caseFileId and dossierId. |
| dossierdocumenturl | Returns the download URL for the certified dossier PDF. Requires: dossier_certify (CERTIFIED status), caseFileId, dossierId. |
| dossierpackageurl | Returns the download URL for the full dossier package (PDF + evidence files). Requires: dossier_certify (CERTIFIED status), caseFileId, dossierId. |
| dossiervisibility | Updates the visibility (public/private) of a certified dossier. Requires: dossiercertify (CERTIFIED status), caseFileId, dossierId. |
| dossier_delete | Deletes a dossier. Available in DRAFT status (to discard before certification) or in CERTIFIED status (to permanently remove the certified dossier). Irreversible. Requires: caseFileId and dossierId. |
| dossiergroupcertify | Creates AND certifies a dossier from a single sealed evidence group in one call (express path). Requires: evidenceseal (CLOSED status), casefilecreate → caseFileId, evidencegroup_create → evidenceGroupId. Generate a UUID v4 string for id. Use when you have exactly one sealed evidence group and don’t need multi-group aggregation. Returns dossierId immediately with CERTIFYING status → poll until CERTIFIED. |
| dossierevidencelink | Links evidence records from a sealed evidence group to a dossier. Requires: dossiercreate → dossierId, evidenceseal (CLOSED status), casefilecreate → caseFileId. Evidence groups MUST be in CLOSED status. Pass the ids array of evidence UUIDs to link. Can be called multiple times for evidence from different case files. |
| dossierevidencelisttolink | Lists evidence items that are available to be linked to a dossier (CLOSED groups not yet linked). Requires: caseFileId and dossierId. |
| dossierevidencelist | Lists the evidence items linked to ONE evidence group of a dossier. Requires: caseFileId, dossierId AND dossierEvidenceGroupId — all three are mandatory. For every evidence item in the dossier regardless of group, use dossierevidencelistbydossier instead. Supports filter, order and page. |
| dossierevidencelistbydossier | Lists every evidence item linked to a dossier, across all of its evidence groups. Requires: caseFileId and dossierId. This is the dossier-wide view; dossierevidencelist is the narrower per-group one and additionally needs a dossierEvidenceGroupId. Supports filter, order and page. Returns { data, meta.totalElements }. |
| dossierevidenceget | Retrieves details of a specific evidence item linked to a dossier. Requires: caseFileId, dossierId, evidenceId. |
| dossierevidencedelete | Removes an evidence item from a dossier. Only available while dossier is in DRAFT status. Requires: caseFileId, dossierId, evidenceId. |
| notificationdocumentadd | Attaches a document to a notification. Two steps: this call registers the file and returns { url }, a presigned upload URL, and you then PUT the raw bytes to that URL with an x-amz-checksum-sha256 header. Generate a UUID v4 for id, and compute the file’s SHA-256 hex hash BEFORE calling — it goes in hash. ORDER MATTERS AND GETTING IT WRONG FAILS THE SEND: add every document BEFORE adding recipients, and wait until each document reaches READYTOSEND (poll notificationdocumentlist; roughly 8 seconds) before calling notificationrequestsend. Attaching after recipients, or sending while a document is still PENDING, returns 409/404 NOTIFICATIONNOTFOUND. The maximum number of attachments is a per-subscription setting rather than a fixed API limit, so do not assume a number. Attachments can be bundled into the delivery certificate — see notificationcertificatepackage_url. |
| notificationrequestcreate | Creates a certified notification request. Requires: casefilecreate → caseFileId. Generate a UUID v4 for id. Set language to enGB or esES. Returns notificationRequestId. Add at least one receiver with notificationreceiveradd before sending. IMPORTANT: The content field must be valid HTML — plain text without HTML tags will not render on the recipient landing page. Only the following HTML formats are supported: paragraphs (
), bold (), italic (), unordered lists (
- ), ordered lists (
- ). Do not use other HTML tags or CSS. Avoid special typographic characters (em dashes, smart quotes) in
subject; use standard ASCII equivalents (hyphen, straight quotes) instead. |
|notificationrequestsend| Sends the certified notification to all added receivers. Requires: notificationrequestcreate → notificationRequestId, notificationreceiveradd (at least one receiver), casefilecreate → caseFileId. ASYNC: triggers delivery. Poll notificationrequeststatus until status is SENT or beyond (PARTIALLYREAD, FULLYREAD) before generating certificates. |
|notificationrequeststatus| Checks the delivery status of a certified notification. Requires: notificationRequestId, caseFileId. Returns status (CREATING|DRAFT|INPROCESS|SENT|PARTIALLYREAD|FULLYREAD|PARTIALLYANSWERED|FULLYANSWERED). Poll until status is SENT or beyond. Do not call notificationcertificateget while status is CREATING, DRAFT, or INPROCESS. |
|notificationreceiveradd| Adds a recipient to a notification request. Requires: notificationrequestcreate → notificationRequestId, casefilecreate → caseFileId. Theidcan be a UUID v4 or custom string (e.g. your internal user ID). Returns receiverId — save it for notificationcertificateget. Delivery is by email always; set sendWaUrl for a WhatsApp link, sendSmsUrl for an RCS/SMS link (the channel negotiates: RCS where the handset supports it, SMS otherwise), and otpRequired to challenge the recipient with a one-time code. Any of those three needs phonePrefix (with the +) and phoneNumber. Add all receivers before calling notificationrequestsend — but if the notification has attachments, add those FIRST (see notificationdocumentadd). |
|notificationcertificateget| Generates or retrieves a PDF certificate for a specific receiver proving delivery and/or reading of the notification. Requires: notificationrequestsend, notificationreceiveradd → receiverId, notificationrequestcreate → notificationRequestId, casefilecreate → caseFileId. Generate a UUID v4 foridthe first time you request a certificate for that receiver and reuse that same id when polling. Call only after notificationrequeststatus is SENT or beyond. The first call may return {} while the certificate is being generated; poll/re-call notificationcertificateget until the response includes a pdfUrl/documentUrl or a CERTIFIED/final status. If the backend returns Forbidden/Unexpected at SENT, do not keep hammering the certificate endpoint: poll notificationrequeststatus until READ/ANSWERED or verify in the UI, then retry with the same certificate id. For ACCEPTEDORNOT notifications, call once after a certifiable delivery/read state for an intermediate certificate and again after PARTIALLYANSWERED/FULLYANSWERED for the final answer certificate. |
|notificationrequestlist| Lists the certified notifications visible to a user. Requires userId (from sessionlogin, sessioninfo or profileget) — this listing is user-scoped, not case-file-scoped, so it spans every case file unless you filter. Use this to recover a notificationRequestId you no longer have; it is the only way to find one. Returns per notification: id, code, subject, status, type, sentAt, receiverStats and the owning caseFile. Filter bystatusorstatuses(CREATING, DRAFT, INPROCESS, SENT, PARTIALLYREAD, FULLYREAD, PARTIALLYANSWERED, FULLYANSWERED), bycaseFileIds, bysearchover the subject, or byreceiversSearchto find the notification sent to a given recipient. Paginated. |
|notificationrequestupdate| Edits a notification that has not been sent: subject, content, type and language. Requires notificationRequestId and caseFileId.contentmust be valid HTML — plain text is accepted by the API but does NOT render on the recipient landing page. Supported tags only:, , ,
- ,
- ; no other tags and no CSS. Keep
subjectto plain ASCII (no em dashes, no smart quotes), 100 characters maximum. TESTED: once the notification has been sent the API rejects this with 403 Forbidden, so editing only works before the send. To change which case file it belongs to use notificationrequestcasefilemove — this tool does not move it. |
|notificationrequestdelete| Deletes a notification. Requires notificationRequestId and caseFileId. There is no undo. TESTED: once the notification has been sent the API rejects this with 403 Forbidden — a sent notification is delivery evidence and cannot be removed. If you only want it filed elsewhere, use notificationrequestcasefilemove instead. |
|notificationrequestduplicate| Creates a new DRAFT notification from an existing one, copying its content, its recipients and its attachments. Works whatever state the original is in, so this is how you resend to the same people or reuse a sent notification as a template. Generate a UUID v4 foridand supply a newsubject; passcaseFileIdin the body to place the copy in a different case file, or omit it to keep it alongside the original. THE COPY IS BUILT ASYNCHRONOUSLY: it starts in CREATING with zero recipients and zero documents, and fills in afterwards, so reading it immediately shows an empty notification that is not empty. Poll notificationrequeststatus until the status is DRAFT before inspecting or sending it. Because recipients ARE copied, review them with notificationreceiverlist before calling notificationrequestsend — otherwise you will send to the original list again. |
|notificationrequestcasefilemove| Moves a notification to a different case file. Note the two caseFileId values: the one in the path is where the notification is NOW, and the one in the body is the destination. Notifications are grouped by case file, and this is the only way to change that grouping without duplicating. |
|notificationreceiverlist| Lists a notification’s recipients with their individual delivery state. Returns per recipient: id, firstName, lastName, email, phonePrefix/phoneNumber, status (INVALID, READYTOSEND, SENT, READ, ANSWERED, ERROR), statusUpdatedAt,answeronce they respond, emailBounced, and validationError (TAKEN, ISDEFINED, ISINVALID) for a rejected address. Worth calling before notificationrequestsend to see whether any address came back INVALID, and after sending to see who read or answered. Also the way to recover a receiverId for notificationcertificateget. Paginated; filterable by id. |
|notificationreceiverupdate| Corrects a recipient’s details: firstName, lastName, email, phonePrefix, phoneNumber. Requires receiverId, notificationRequestId and caseFileId. Use this to fix a mistyped address rather than deleting and re-adding, which would lose the receiverId. phonePrefix must include the + (for example +34). A phone number is required if the recipient is to receive the RCS/SMS link (sendSmsUrl), the WhatsApp link (sendWaUrl), or an OTP challenge (otpRequired). |
|notificationreceiverdelete| Removes a recipient from a notification. Requires receiverId, notificationRequestId and caseFileId. To remove every address the platform rejected in one call, use notificationreceiverinvalid_purge rather than deleting them one by one. |
|notificationreceiveraddbulk| Adds several recipients in one call instead of one notificationreceiveradd per person. Passreceiversas an array; each entry needsid(you generate it), firstName, lastName and email, and may carry phonePrefix (with the +) and phoneNumber. Note this bulk form does NOT accept the per-recipient otpRequired, sendWaUrl or sendSmsUrl flags that the single-recipient tool does — set the defaults on the request instead (otpByDefault, sendWaUrlByDefault, sendSmsUrlByDefault). The maximum number of recipients is a per-subscription setting, not a fixed API limit: it varies by tenant and platform, so do not assume a number — add them and read the error if the tenant’s cap is exceeded. Add every recipient before calling notificationrequestsend, then check the result with notificationreceiver_list, since a rejected address appears with status INVALID. |
|notificationreceiverinvalidpurge| Removes every recipient whose status is INVALID — addresses the platform rejected as malformed or duplicated — from a notification in a single call. Requires notificationRequestId and caseFileId. Recipients in any other status are left untouched. AN INVALID RECIPIENT BLOCKS THE SEND, so run this (or fix the addresses with notificationreceiverupdate) before notificationrequestsend, or the notification will not go out. Use notificationreceiver_list first to see what will go. |
|notificationdocumentlist| Lists the documents attached to a notification with their processing status, and it is what you poll after notificationdocumentadd: a newly registered document starts at PENDING and reaches READYTOSEND in roughly 8 seconds. Calling notificationrequestsend while any document is still PENDING fails with 409/404 NOTIFICATIONNOTFOUND. Poll with a bounded retry — every few seconds, a dozen attempts at most. Requires notificationRequestId and caseFileId. Paginated. |
|notificationdocumentdelete| Removes an attachment from a notification. Requires documentId (from notificationdocumentlist), notificationRequestId and caseFileId. |
|notificationdocumentdownloadurl| Returns { downloadUrl }, a temporary link to an attachment as it was sent. Requires documentId (from notificationdocument_list), notificationRequestId and caseFileId. Use it to retrieve a file you attached or to verify what a recipient received. The URL is presigned and expires — fetch it when you need it rather than storing it. |
|notificationcertificatelist| Lists the delivery certificates already generated for one recipient, so you can reuse one instead of generating a duplicate. Requires receiverId, notificationRequestId and caseFileId. Returns per certificate: id, status (DRAFT, CERTIFYING, CERTIFIED), language, createdAt, certifiedAt,partial— whether it is an intermediate certificate issued before the recipient finished responding — andembeddedDocuments. Do not readembeddedDocumentsas “the package contains the attachments”: in a tested run it was false on a notification that had an attachment, and notificationcertificatepackageurl still returned a ZIP carrying that attachment. Once a certificate is CERTIFIED, download it with notificationcertificatedocumenturl (the certificate alone) or notificationcertificatepackage_url (a ZIP that also carries the attachments). |
|notificationcertificatedocumenturl| Returns { documentUrl } for the certificate PDF on its own, WITHOUT the attachments. Requires certificateId, receiverId, notificationRequestId and caseFileId. Wait until the certificate is CERTIFIED: generation is asynchronous and the first call can 404 or come back empty while it is still CERTIFYING, so poll a few times with a bounded retry rather than hammering it. If you want the attachments bundled in, use notificationcertificatepackageurl instead. |
|notificationcertificatepackageurl| Returns { packageUrl } for a ZIP containing the certificate AND the notification’s attachments — the “with annexes” form. There is no separate preview flag anywhere in the API: the package carries the annexes, the document is the certificate alone. Requires certificateId, receiverId, notificationRequestId and caseFileId. Same preconditions as notificationcertificatedocumenturl — wait for CERTIFIED, and expect the first call to fail while generation is still running. |
|casefilecreate| Creates a new case file — the top-level container for all related operations (evidence, notifications, dossiers, chats). Call this first before any other operation. Generate a UUID v4 forid. Returns caseFileId needed for all subsequent calls. |
|casefilelist| Lists all case files in your GoCertius account. Pass userId (from sessionlogin or sessioninfo) to scope results to your account. Returns paginated list with IDs, names, and status. |
|casefileget| Retrieves details of a specific case file. Requires: caseFileId. Use to verify a case file exists before creating evidence groups, dossiers, or notifications. |
|casefiledelete| Deletes a case file and everything filed inside it — evidence groups, dossiers, notifications and their certificates. Irreversible, with no confirmation step and no recycle bin. Requires: caseFileId. Returns no body (HTTP 204); confirm with casefilelist. Do not call it to ‘clean up’ unless the user asked for that case file to be destroyed. |
|chatcreate| Creates a certified chat channel (Telegram). IMPORTANT: Chats can only be created in the user’s personal case file (created automatically when the GoCertius account was opened). Do not use a manually created case file — use sessioninfo → casefilelist to find the personal case file (oldest createdAt, owned by the user). Generate a UUID v4 forid. Set service to Telegram. Returns immediately and the chat may start in statuscreating; call chat_get and wait until it is registered/active before requesting the invitation URL or certificates. |
|chatget| Retrieves details of a certified chat. Requires: personal caseFileId and chatcreate → chatId. Returns status, participants, and registeredAt timestamp. After chatcreate, poll chatget until status is active/registered and registeredAt is present; createdAt is not enough for certificate creation. |
|chatinvitationurl| Returns the Telegram invitation URL for a certified chat. Requires: chatcreate → chatId and the personal caseFileId. Do not call while chatget still shows statuscreating; wait until the chat is registered/active, otherwise the API can answer Chat not found. Share the returned invitationUrl with participants so they can join the certified channel. |
|chatcertificatecreate| Creates a certificate of a range of messages from a certified chat. Requires: chatcreate → chatId, personal caseFileId, chatget → registeredAt, and messages already present in the Telegram channel. Generate a UUID v4 forid. Do not use createdAt as a substitute for registeredAt; if registeredAt is missing, the chat is not ready to certify. Specify chatMessagesFrom and chatMessagesTo as ISO timestamps (chatMessagesFrom must be AFTER registeredAt). ASYNC: poll chatcertificateget until status === CERTIFIED. |
|chatcertificateget| Retrieves the certificate of a certified chat. Requires: chatcertificatecreate → certificate id, chatcreate → chatId, casefile_create → caseFileId. Returns documentUrl when status reaches CERTIFIED. Poll until CERTIFIED before using documentUrl. |
|sessionlogin| Forces the MCP server to re-authenticate with GoCertius. Takes NO parameters and accepts no credentials — the server re-exchanges the user key it was configured with (MCPAUTHUSERKEY) for a fresh session token and reports the resulting userId and expiry. The MCP server manages authentication automatically; call this only if you hit 401 errors. When the server holds no credential of its own (none configured, or you supplied your own Bearer token) there is no session of ours to renew and the tool returns an error naming MCPAUTHUSER_KEY. |
|sessioninfo| Retrieves information about the current authenticated session: userId,type(how this MCP session authenticated — always UserKey, the server’s only auth flow),accountLoginType(a different fact: how the GoCertius account itself signs in, Password or OpenId, null if the API omits it), email, companyId and defaultCaseFileId. Use to verify who is authenticated or check session validity; identity is resolved via GET /profile. If you only need the userId, prefer profileget — it is the canonical source (id) and returns the rest of the profile too. No required parameters. |
|profileget| Returns the authenticated user’s own profile. It identifies the caller from the session token alone — no email or any other input needed — so it works on every deployment, including a per-request Bearer one. Itsidfield IS your userId (UUID): the value required by casefilelist and every /users/{userId}/… operation. Prefer this over sessioninfo when you need the userId: it is the canonical source. Also returns companyId (needed to subscribe to the notifications SSE stream) and defaultCaseFileId (the personal case file — the one chats must use). Also returnspermit, a set of booleans — { evidences, idVerifications, notifications, chats, signatures } — that says which tool families this account may use at all: a false entry means every tool in that family returns 403 regardless of inputs, and no retry or different argument will help. Read it before calling into a family for the first time. Note that a family with no tools in this server will read false and that is expected, not a misconfiguration. No parameters. |
|evidenceupload| Uploads a local file as evidence in one step: computes its SHA-256, registers the evidence record (custodyType INTERNAL = GoCertius stores the file), and uploads the bytes to S3 — no manual hashing or PUT needed. Internally this follows the required GoCertius sequence: create INTERNAL evidence → receive uploadFileUrl (presigned S3 URL) → PUT file bytes → return uploaded:true. Requires: casefilecreate → caseFileId, evidencegroupcreate → evidenceGroupId. Provide EXACTLY ONE offilePath(absolute local path, stdio/local mode only) orcontentBase64(base64-encoded file content, ~10 MB max). Use evidenceupload when the file is on the local machine; use evidencecreate when you already have the SHA-256 hash, need to inspect/use uploadFileUrl manually, or have a public fileUrl. After this tool succeeds, verify with evidenceget/evidencelist and only then call evidenceseal. If this tool fails before returning an evidence id, check evidencelist before retrying; if retrying manually, use evidencecreate with a fresh UUID. Local files must be under 1 GiB. |
|notificationsend| Sends a certified notification to one or more recipients in a single call: creates the notification request, adds every recipient, and sends it. Generates every UUID itself — do not pass any id. Requires casefilecreate → caseFileId.contentMUST be HTML: plain text is accepted by the API and reports SENT but does not render on the recipient’s landing page. Supported tags only:, , ,
- ,
- — no other tags, no CSS. Keep
subjectto plain ASCII, 100 characters maximum. Delivery is always by email; per recipient you can additionally set sendWaUrl (WhatsApp), sendSmsUrl (RCS or SMS depending on the handset) and otpRequired (one-time code), each of which needs phonePrefix with the + and phoneNumber. The maximum number of recipients is a per-subscription setting, not a fixed limit, so none is enforced here — the API rejects an oversized batch. This tool does NOT attach files; use notification
- — no other tags, no CSS. Keep
|notificationsendwithattachments| Sends a certified notification WITH one or more attached documents to one or more recipients, in a single call. Use notificationsend instead when there are no attachments. This tool exists separately because attachments impose an ordering rule the API enforces and does not forgive: documents must be registered and fully uploaded BEFORE any recipient is added, and every document must reach READYTOSEND before the notification is sent — otherwise the send fails with 409/404 NOTIFICATIONNOTFOUND. The tool performs that whole sequence for you: create → register and upload each document → wait for READYTOSEND → add recipients → send. Each attachment takes a local file path, base64 content, an HTTPS URL, or an n8n binary reference; the hash and the upload are handled internally. Generates every UUID itself — do not pass any id. Requires casefilecreate → caseFileId.contentMUST be HTML: plain text is accepted by the API and reports SENT but does not render on the recipient’s landing page. Supported tags only:, , ,
- ,
- . Keep
subjectto plain ASCII, 100 characters maximum. Delivery is always by email; per recipient you can additionally set sendWaUrl (WhatsApp), sendSmsUrl (RCS or SMS depending on the handset) and otpRequired (one-time code), each of which needs phonePrefix with the + and phoneNumber. The maximum number of attachments and of recipients are per-subscription settings, not fixed limits, so neither is enforced here. IF AN ATTACHMENT FAILS THE RUN STOPS BEFORE RECIPIENTS ARE ADDED, on purpose: once recipients exist the API will not accept further documents, so continuing would produce a notification that can never carry the missing file. The result reports the draft’s notificationRequestId so you can retry or delete it. An INVALID recipient blocks the send, so the tool checks for one before sending and reports invalidRecipients instead of attempting a doomed send. If the initial create fails the tool raises an error instead: common causes are a caseFileId that does not exist, a subject over 100 characters, and an exhausted contracted notification plan, which no retry will fix. If that error is a timeout rather than a rejection, check notificationrequestlist before retrying — the request may have been created anyway. Certificates can bundle the attachments — see notificationcertificatepackage_url. |Coexistence
This MCP server is the current, actively maintained interface for the GoCertius API.
It coexists safely with any other MCP servers in your setup — it exposes only GoCertius-namespaced tools and shares no local state with other servers.
License
MIT — see LICENSE.
- . Keep
- ,
- ; no other tags and no CSS. Keep
- ,
- ). Do not use other HTML tags or CSS. Avoid special typographic characters (em dashes, smart quotes) in