Connects your AI agent to EADTrust's digital trust infrastructure: qualified evidence timestamping via Evidence Manager and electronic signature workflows through Signature Manager. You get tools to hash and register evidence with chain-of-custody tracking, create multi-party signature requests with signatories, validators, and observers, and poll for completion states. Authentication runs through Okta client credentials. Ships across npm, Docker Hub, the official MCP registry, n8n community nodes, and Smithery. Useful when you need legally compliant evidence capture or structured signature workflows baked into agent automation, especially in regulated contexts where audit trails and qualified timestamps matter.
EAD Factory MCP — Digital Trust services APIs for your agents.
This MCP server bridges any MCP-compatible agent (Claude Code, Claude Desktop, Cursor, Windsurf, Cline, VS Code, JetBrains, Zed) to EADTrust's Digital Trust services: Evidence Manager (qualified digital evidence + timestamping) and Signature Manager (electronic signature workflows).
Need credentials? See: Get your testing credentials here!!
npx -y @g-digital/mcp-ead-factory
You will need Okta credentials (OKTA_CLIENT_ID + OKTA_CLIENT_SECRET) and at least the Evidence Manager + Signature Manager base URLs for the environment you target (see Environment URLs).
This MCP is published to every major MCP distribution channel by the g-digital MCP distribution pipeline. Pick whichever fits your stack:
| Channel | Install command / URL |
|---|---|
| npm | npx -y @g-digital/mcp-ead-factory — npmjs.com/package/@g-digital/mcp-ead-factory |
| Docker Hub | docker pull gdigital/ead-factory:latest — hub.docker.com/r/gdigital/ead-factory |
| MCP Official Registry | Auto-discovered as io.github.g-digital-by-Garrigues/ead-factory by any client that reads the registry — registry.modelcontextprotocol.io |
| n8n community node | In n8n Settings → Community Nodes → install @g-digital/n8n-nodes-ead-factory (works with the AI Agent node via usableAsTool) — npmjs.com/package/@g-digital/n8n-nodes-ead-factory |
| Smithery | smithery mcp install g-digital/ead-factory (from v1.0.7) — smithery.ai/servers/g-digital/ead-factory |
Every channel ships the same MCP server contract; the tools and env-var configuration below apply regardless of which install path you choose.
| Tool | Description |
|---|---|
generate_evidence | Full workflow: authenticate → SHA-256 hash → register evidence → upload file to S3 → poll until COMPLETED/ERROR |
get_evidence | Retrieve full evidence details by ID (status, timestamps, custody, metadata) |
| Tool | Description |
|---|---|
create_signature_request | Creates a new signature request (DRAFT). Supports fullFlow=true to complete the entire flow in one call using preconfigured participants |
add_document_to_signature_request | Adds a document to a DRAFT signature request and uploads the file to S3 |
add_signatory_to_document | Adds a signatory to a document within a signature request |
add_validator_to_signatory | Adds a validator to a signatory (must approve before the signatory can sign) |
add_observer_to_document | Adds an observer to a document (receives notifications but does not sign) |
activate_signature_request | Activates a signature request (DRAFT → ACTIVE), triggering notifications to signatories |
get_signature_request | Retrieves full details of a signature request by ID (status, documents, participants, history) |
{
"mcpServers": {
"ead-factory": {
"args": [
"-y",
"@g-digital/mcp-ead-factory"
],
"command": "npx",
"env": {
"API_BASE_URL": "",
"FULL_FLOW_EMAIL_BASE": "",
"FULL_FLOW_FILE_PATH": "",
"HTTP_PORT": "",
"OKTA_CLIENT_ID": "",
"OKTA_CLIENT_SECRET": "<PASTE_OKTA_CLIENT_SECRET_HERE>",
"OKTA_SCOPE": "",
"OKTA_TOKEN_URL": "",
"POLL_INTERVAL_MS": "",
"POLL_MAX_ATTEMPTS": "",
"SIGNATURE_API_BASE_URL": "",
"TRANSPORT": ""
}
}
}
}
Need credentials? See: https://eadtrust.example.com/onboarding
{
"mcpServers": {
"ead-factory": {
"args": [
"-y",
"@g-digital/mcp-ead-factory"
],
"command": "npx",
"env": {
"API_BASE_URL": "",
"FULL_FLOW_EMAIL_BASE": "",
"FULL_FLOW_FILE_PATH": "",
"HTTP_PORT": "",
"OKTA_CLIENT_ID": "",
"OKTA_CLIENT_SECRET": "<PASTE_OKTA_CLIENT_SECRET_HERE>",
"OKTA_SCOPE": "",
"OKTA_TOKEN_URL": "",
"POLL_INTERVAL_MS": "",
"POLL_MAX_ATTEMPTS": "",
"SIGNATURE_API_BASE_URL": "",
"TRANSPORT": ""
}
}
}
}
Need credentials? See: https://eadtrust.example.com/onboarding
{
"mcpServers": {
"ead-factory": {
"args": [
"-y",
"@g-digital/mcp-ead-factory"
],
"command": "npx",
"env": {
"API_BASE_URL": "",
"FULL_FLOW_EMAIL_BASE": "",
"FULL_FLOW_FILE_PATH": "",
"HTTP_PORT": "",
"OKTA_CLIENT_ID": "",
"OKTA_CLIENT_SECRET": "<PASTE_OKTA_CLIENT_SECRET_HERE>",
"OKTA_SCOPE": "",
"OKTA_TOKEN_URL": "",
"POLL_INTERVAL_MS": "",
"POLL_MAX_ATTEMPTS": "",
"SIGNATURE_API_BASE_URL": "",
"TRANSPORT": ""
}
}
}
}
Need credentials? See: https://eadtrust.example.com/onboarding
{
"mcpServers": {
"ead-factory": {
"args": [
"-y",
"@g-digital/mcp-ead-factory"
],
"command": "npx",
"env": {
"API_BASE_URL": "",
"FULL_FLOW_EMAIL_BASE": "",
"FULL_FLOW_FILE_PATH": "",
"HTTP_PORT": "",
"OKTA_CLIENT_ID": "",
"OKTA_CLIENT_SECRET": "<PASTE_OKTA_CLIENT_SECRET_HERE>",
"OKTA_SCOPE": "",
"OKTA_TOKEN_URL": "",
"POLL_INTERVAL_MS": "",
"POLL_MAX_ATTEMPTS": "",
"SIGNATURE_API_BASE_URL": "",
"TRANSPORT": ""
}
}
}
}
Need credentials? See: https://eadtrust.example.com/onboarding
{
"mcpServers": {
"ead-factory": {
"args": [
"-y",
"@g-digital/mcp-ead-factory"
],
"command": "npx",
"env": {
"API_BASE_URL": "",
"FULL_FLOW_EMAIL_BASE": "",
"FULL_FLOW_FILE_PATH": "",
"HTTP_PORT": "",
"OKTA_CLIENT_ID": "",
"OKTA_CLIENT_SECRET": "<PASTE_OKTA_CLIENT_SECRET_HERE>",
"OKTA_SCOPE": "",
"OKTA_TOKEN_URL": "",
"POLL_INTERVAL_MS": "",
"POLL_MAX_ATTEMPTS": "",
"SIGNATURE_API_BASE_URL": "",
"TRANSPORT": ""
}
}
}
}
Need credentials? See: https://eadtrust.example.com/onboarding
{
"servers": {
"ead-factory": {
"args": [
"-y",
"@g-digital/mcp-ead-factory"
],
"command": "npx",
"env": {
"API_BASE_URL": "",
"FULL_FLOW_EMAIL_BASE": "",
"FULL_FLOW_FILE_PATH": "",
"HTTP_PORT": "",
"OKTA_CLIENT_ID": "",
"OKTA_CLIENT_SECRET": "<PASTE_OKTA_CLIENT_SECRET_HERE>",
"OKTA_SCOPE": "",
"OKTA_TOKEN_URL": "",
"POLL_INTERVAL_MS": "",
"POLL_MAX_ATTEMPTS": "",
"SIGNATURE_API_BASE_URL": "",
"TRANSPORT": ""
}
}
}
}
Need credentials? See: https://eadtrust.example.com/onboarding
{
"mcpServers": {
"ead-factory": {
"args": [
"-y",
"@g-digital/mcp-ead-factory"
],
"command": "npx",
"env": {
"API_BASE_URL": "",
"FULL_FLOW_EMAIL_BASE": "",
"FULL_FLOW_FILE_PATH": "",
"HTTP_PORT": "",
"OKTA_CLIENT_ID": "",
"OKTA_CLIENT_SECRET": "<PASTE_OKTA_CLIENT_SECRET_HERE>",
"OKTA_SCOPE": "",
"OKTA_TOKEN_URL": "",
"POLL_INTERVAL_MS": "",
"POLL_MAX_ATTEMPTS": "",
"SIGNATURE_API_BASE_URL": "",
"TRANSPORT": ""
}
}
}
}
Need credentials? See: https://eadtrust.example.com/onboarding
{
"mcpServers": {
"ead-factory": {
"args": [
"-y",
"@g-digital/mcp-ead-factory"
],
"command": "npx",
"env": {
"API_BASE_URL": "",
"FULL_FLOW_EMAIL_BASE": "",
"FULL_FLOW_FILE_PATH": "",
"HTTP_PORT": "",
"OKTA_CLIENT_ID": "",
"OKTA_CLIENT_SECRET": "<PASTE_OKTA_CLIENT_SECRET_HERE>",
"OKTA_SCOPE": "",
"OKTA_TOKEN_URL": "",
"POLL_INTERVAL_MS": "",
"POLL_MAX_ATTEMPTS": "",
"SIGNATURE_API_BASE_URL": "",
"TRANSPORT": ""
}
}
}
}
Need credentials? See: https://eadtrust.example.com/onboarding
| Name | Required | Secret | Description |
|---|---|---|---|
API_BASE_URL | Yes | No | Evidence Manager API base URL |
FULL_FLOW_EMAIL_BASE | Yes | No | Full flow base email — used to compose participant emails (user+signatory@domain, etc.) |
FULL_FLOW_FILE_PATH | Yes | No | Full flow default file path |
HTTP_PORT | Yes | No | HTTP_PORT |
OKTA_CLIENT_ID | Yes | No | OKTA_CLIENT_ID |
OKTA_CLIENT_SECRET | Yes | Yes | OKTA_CLIENT_SECRET (See https://eadtrust.example.com/onboarding for credential acquisition.) |
OKTA_SCOPE | Yes | No | OKTA_SCOPE |
OKTA_TOKEN_URL | Yes | No | OAuth credentials (Okta client_credentials flow) Used both for calling Evidence Manager API and for verifying incoming Bearer tokens (HTTP mode) |
POLL_INTERVAL_MS | Yes | No | Polling configuration for evidence status |
POLL_MAX_ATTEMPTS | Yes | No | POLL_MAX_ATTEMPTS |
SIGNATURE_API_BASE_URL | Yes | No | Signature Manager API base URL |
TRANSPORT | Yes | No | Transport: "stdio" for local Claude Code, "http" for remote deployment with auth |
| Environment | API_BASE_URL | OKTA_TOKEN_URL |
|---|---|---|
| INT | https://api.int.gcloudfactory.com/digital-trust | https://legalappfactory.okta.com/oauth2/aus5zlw4kr0vhHKyx417/v1/token |
| PRE | https://api.pre.gcloudfactory.com/digital-trust | https://sso.garrigues.io.builders/oauth2/aus653dgdgTFL2mhw417/v1/token |
| PRO | https://api.gcloudfactory.com/digital-trust | https://legalappfactory.okta.com/oauth2/aus657e2pcoS6hOS6417/v1/token |
| Environment | API_BASE_URL |
|---|---|
| INT | https://api.int.eadtrust.gcloudfactory.com/digital-trust |
| PRO | https://api.eadtrust.gcloudfactory.com/digital-trust |
Set TRANSPORT=http to run the server as an HTTP service. The /mcp endpoint requires a valid Okta Bearer token (verified against the introspection endpoint derived from OKTA_TOKEN_URL). The /health endpoint is unauthenticated for monitoring.
Client (Claude Code / MCP client)
│
├─ stdio ──► McpServer
│
└─ HTTP ──► Express + Bearer auth (Okta introspect) ──► StreamableHTTP ──► McpServer
│
tools/call
│
▼
workflow.service
├── auth.service (Okta client_credentials → token cache)
├── hash.service (SHA-256 from local file)
├── evidence.service (POST /api/v1/private/evidences)
└── s3-upload.service (PUT presigned URL + retry)
generate_evidence — Input schema| Field | Type | Required | Description |
|---|---|---|---|
filePath | string | Yes | Absolute path to the file on disk |
evidenceId | string (UUID) | Yes | Unique ID for idempotency |
title | string | Yes | Human-readable title |
createdBy | string | Yes | Creator name (max 50 chars) |
capturedAt | string (ISO 8601) | Yes | Capture datetime |
custodyType | INTERNAL | EXTERNAL | No | Defaults to INTERNAL |
testimonyTSP | boolean | No | TSP via EADTrust (default true) |
testimonyDLT | boolean | No | DLT via Lacnet (requires tenant activation) |
requiredTestimonyProviders | string | No | Comma-separated: "TSP", "DLT", "TSP,DLT" |
metadata | string (JSON) | No | Custom key-value pairs as a JSON string |
POST {OKTA_TOKEN_URL} — OAuth client_credentials tokenPOST {API_BASE_URL}/api/v1/private/evidences — register evidenceGET {API_BASE_URL}/api/v1/private/evidences/{id} — fetch evidencePUT <presigned-s3-url> — upload file binaryMIT
API_BASE_URL*Evidence Manager API base URL
FULL_FLOW_EMAIL_BASE*Full flow base email — used to compose participant emails (user+signatory@domain, etc.)
FULL_FLOW_FILE_PATH*Full flow default file path
HTTP_PORT*HTTP_PORT
OKTA_CLIENT_ID*OKTA_CLIENT_ID
OKTA_CLIENT_SECRET*secretOKTA_CLIENT_SECRET (See https://eadtrust.example.com/onboarding for credential acquisition.)
OKTA_SCOPE*OKTA_SCOPE
OKTA_TOKEN_URL*OAuth credentials (Okta client_credentials flow) Used both for calling Evidence Manager API and for verifying incoming Bearer tokens (HTTP mode)
POLL_INTERVAL_MS*Polling configuration for evidence status
POLL_MAX_ATTEMPTS*POLL_MAX_ATTEMPTS
SIGNATURE_API_BASE_URL*Signature Manager API base URL
TRANSPORT*Transport: "stdio" for local Claude Code, "http" for remote deployment with auth