docusign
v1.0.3-ghast.1Create, send, search, inspect, and automate Docusign agreements, envelopes, recipients, dates, obligations, and Workflow Builder processes through Docusign's official hosted MCP server.
By DocusignLicense: MIT0 GitHub starsUpdated 3 hours ago
Directory evidence
- Runtimes
- Agent Plugins
- Parsed components
- 4 skill or MCP entries
- Source updated
- Aug 30, 2026
- Manifest status
- Canonical path parsed
The directory validates manifest shape and source location. It does not execute the plugin or provide a security endorsement. Review the indexing methodology →
Get the plugin
git clone https://github.com/Trapezohe/ghast-pluginsClone the source repository, then follow its setup instructions to add the plugin to a compatible client. The plugin root is plugins/docusign/.
This listing currently publishes only the generic Agent Plugins format. Automatic install commands for other clients are not generated yet.
Plugin files
├── plugin.json├── skills/docusign/SKILL.md├── skills/docusign-setup/SKILL.md├── skills/docusign-troubleshooting/SKILL.md└── mcp.json
Included Skills3
Create, send, search, inspect, and automate Docusign agreements, envelopes, recipients, dates, obligations, and Workflow Builder processes through Docusign's official hosted MCP server.
Configure Docusign's official hosted MCP server for Ghast using a user-owned confidential OAuth application.
Diagnose Docusign MCP environment, OAuth app, callback, credential-file, local bridge, entitlement, and tool failures in Ghast.
MCP servers1
- command
- node
- args
- -e const fs = require("node:fs"); const http = require("node:http"); const https = require("node:https"); const path = require("node:path"); const { spawn } = require("node:child_process"); const clientFile = process.env.DOCUSIGN_OAUTH_CLIENT_FILE; if (!clientFile) { console.error( "Set DOCUSIGN_OAUTH_CLIENT_FILE to an absolute OAuth client JSON path.", ); process.exit(1); } if (!path.isAbsolute(clientFile)) { console.error("DOCUSIGN_OAUTH_CLIENT_FILE must be an absolute path."); process.exit(1); } let clientInfo; let stat; try { stat = fs.statSync(clientFile); clientInfo = JSON.parse(fs.readFileSync(clientFile, "utf8")); } catch { console.error( "DOCUSIGN_OAUTH_CLIENT_FILE must point to readable valid JSON.", ); process.exit(1); } if ( typeof clientInfo.client_id !== "string" || !clientInfo.client_id || typeof clientInfo.client_secret !== "string" || !clientInfo.client_secret ) { console.error( "Docusign OAuth JSON must contain client_id and client_secret.", ); process.exit(1); } if (process.platform !== "win32" && (stat.mode & 0o077) !== 0) { console.error("Protect the Docusign OAuth JSON with chmod 600."); process.exit(1); } const environment = ( process.env.DOCUSIGN_MCP_ENVIRONMENT || "demo" ).trim().toLowerCase(); const endpoints = { demo: "https://mcp-d.docusign.com/mcp", production: "https://mcp.docusign.com/mcp", }; const remoteUrl = endpoints[environment]; if (!remoteUrl) { console.error( "DOCUSIGN_MCP_ENVIRONMENT must be either demo or production.", ); process.exit(1); } const callbackPort = 3335; const proxyPort = Number(process.env.DOCUSIGN_MCP_PROXY_PORT || "3336"); if ( !Number.isInteger(proxyPort) || proxyPort < 1024 || proxyPort > 65535 || proxyPort === callbackPort ) { console.error( "DOCUSIGN_MCP_PROXY_PORT must be an integer from 1024 to 65535 and not 3335.", ); process.exit(1); } const target = new URL(remoteUrl); const scopes = "adm_store_unified_repo_read aow_manage signature"; const protectedResource = { resource: `http://127.0.0.1:${proxyPort}/mcp`, resource_name: "Docusign MCP compatibility bridge", authorization_servers: [target.origin], bearer_methods_supported: ["header"], scopes_supported: scopes.split(" "), resource_documentation: "https://developers.docusign.com/platform/mcp-server/", }; const proxy = http.createServer((request, response) => { const requestUrl = new URL( request.url || "/", `http://127.0.0.1:${proxyPort}`, ); if ( requestUrl.pathname === "/.well-known/oauth-protected-resource" || requestUrl.pathname === "/.well-known/oauth-protected-resource/mcp" ) { const body = Buffer.from(JSON.stringify(protectedResource)); response.writeHead(200, { "content-type": "application/json", "content-length": String(body.length), "cache-control": "no-store", }); response.end(body); return; } if (requestUrl.pathname !== "/mcp") { response.writeHead(404, { "content-type": "text/plain" }); response.end("Not found"); return; } const headers = { ...request.headers, host: target.host }; if (!headers.authorization) { headers.authorization = "Bearer invalid.invalid.invalid"; } delete headers.connection; delete headers["proxy-connection"]; const upstream = https.request( { protocol: target.protocol, hostname: target.hostname, port: target.port || 443, path: target.pathname + requestUrl.search, method: request.method, headers, }, (upstreamResponse) => { const responseHeaders = { ...upstreamResponse.headers }; delete responseHeaders.connection; response.writeHead(upstreamResponse.statusCode || 502, responseHeaders); upstreamResponse.pipe(response); }, ); upstream.on("error", (error) => { if (!response.headersSent) { response.writeHead(502, { "content-type": "text/plain" }); } response.end(`Docusign MCP upstream error: ${error.message}`); }); request.pipe(upstream); }); let child; proxy.on("error", (error) => { console.error( `Unable to start Docusign MCP compatibility bridge on 127.0.0.1:${proxyPort}: ${error.message}`, ); process.exit(1); }); proxy.listen(proxyPort, "127.0.0.1", () => { const executable = process.platform === "win32" ? "npx.cmd" : "npx"; child = spawn( executable, [ "--yes", "[email protected]", `http://127.0.0.1:${proxyPort}/mcp`, String(callbackPort), "--host", "localhost", "--allow-http", "--transport", "http-only", "--resource", remoteUrl, "--static-oauth-client-info", `@${clientFile}`, "--static-oauth-client-metadata", JSON.stringify({ scope: scopes }), ], { stdio: "inherit" }, ); child.on("error", (error) => { console.error(`Unable to start Docusign MCP bridge: ${error.message}`); proxy.close(); process.exit(1); }); child.on("exit", (code, signal) => { proxy.close(() => { if (signal) process.kill(process.pid, signal); else process.exit(code === null ? 1 : code); }); }); }); for (const signal of ["SIGINT", "SIGTERM"]) { process.on(signal, () => { if (child && !child.killed) child.kill(signal); proxy.close(); }); }
Plugin manifests1
{
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
"name": "docusign",
"version": "1.0.3-ghast.1",
"description": "Create, send, search, inspect, and automate Docusign agreements, envelopes, recipients, dates, obligations, and Workflow Builder processes through Docusign's official hosted MCP server.",
"author": {
"name": "Docusign",
"url": "https://www.docusign.com"
},
"homepage": "https://developers.docusign.com/platform/mcp-server/",
"license": "MIT",
"extensions": {
"ai.trapezohe.ghast": {
"category": "productivity",
"upstreamRevision": "docusign-docs-ee7baa0a1615+chatgpt-0c1925822c08+demo-f64203b8c7d1+prod-8d3bb21db1fb",
"icon": "./assets/icon.svg"
}
}
}For maintainers
If you maintain this plugin, link to this source-backed listing from your README so users can review its manifest and indexed components.
[docusign on Agent Plugins Marketplace](https://pluginsmp.com/plugins/docusign-2)