Dealhub Admin Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Dealhub Admin Mcp (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
A bulleted imperative like {match} tells the agent to never reveal, disclose, or mention something to the user. Used adversarially it can instruct the agent to hide its tool calls or lie about what it did — stripping the transparency a user relies on to trust the agent.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Model Context Protocol (MCP) server for DealHub administrators. Manage versions through Claude and other AI agents using natural language.
The DealHub Admin MCP provides 5 tools for version management:
clientId and clientSecretcd mcp-servers/dealhub-admin
npm installCreate a .env file:
cp .env.example .envEdit .env and add your credentials:
DEALHUB_API_BASE_URL=https://app.dealhub.io
DEALHUB_API_TOKEN=your-client-id:your-client-secretImportant: Replace your-client-id and your-client-secret with actual values from step 1.
npm run buildAdd to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
{
"mcpServers": {
"dealhub-admin": {
"command": "node",
"args": ["/absolute/path/to/mcp-servers/dealhub-admin/dist/index.js"],
"env": {
"DEALHUB_API_BASE_URL": "https://app.dealhub.io",
"DEALHUB_API_TOKEN": "your-client-id:your-client-secret"
}
}
}
}Replace `/absolute/path/to/` with the actual path to your project.
Quit and restart Claude Desktop for changes to take effect.
Once configured, you can use natural language with Claude:
List versions:
Get version details:
Check active version:
Activate a version:
Duplicate a version:
Parameters:
status (optional): Filter by status - "ACTIVE", "DRAFT", or "DEACTIVATED"Example:
{
"status": "DRAFT"
}Response:
[
{
"id": "abc123-def456",
"name": "Q1 2026",
"status": "DRAFT",
"created": "2025-01-15T10:30:00Z"
}
]Parameters:
versionId (string): Version GUID - OR -versionName (string): Version nameNote: Provide either versionId OR versionName, not both.
Example:
{
"versionId": "abc123-def456"
}Response:
{
"guid": "abc123-def456",
"name": "Q1 2026",
"status": "DRAFT",
"createdDate": "2025-01-15T10:30:00Z",
"comparedToVersionGuid": "xyz789"
}Parameters: None
Response:
{
"guid": "xyz789-uvw012",
"name": "Production 2025",
"status": "ACTIVE",
"createdDate": "2024-12-01T08:00:00Z"
}Or if no active version:
No active version foundParameters:
versionId (required): Version GUID to activatecontent (optional): Email content for activation notificationsubject (optional): Email subject for activation notificationExample:
{
"versionId": "abc123-def456",
"subject": "New version activated",
"content": "Q1 2026 version is now active"
}Response:
Version activation started. Request ID: req-789xyz
Status: PENDINGNote: This is an async operation. The version activation happens in the background. Use the request ID to track progress if needed.
Parameters:
versionId (required): Source version GUID to duplicatenewName (required): Name for the duplicated versionExample:
{
"versionId": "abc123-def456",
"newName": "Q2 2026"
}Response:
Version duplication started. Request ID: req-456abc
Status: PENDINGNote: This is an async operation. The version duplication happens in the background. Use the request ID to track progress if needed.
Advances the stateless quote resolve loop one turn. You submit answers, the server re-evaluates the whole playbook (visibility, defaults, mandatory checks) and returns the next questions plus an opaque state blob. The server keeps nothing between turns — thread state back in on every call.
Parameters:
opportunityGuid (required): CRM opportunity GUID to bind toplaybookGuid: required on the first turn (when no state); afterward read from the blobstate: opaque base64+gzip blob from the previous response — omit on turn 1newAnswers: map of attribute path → typed value (e.g. { "Sizing.NumUsers": 50 })newProducts, versionGuid, resolveDefaults, runExternalQueries, includeResolvedForm, crmParams, tracePaths: optionalLoop: turn 1 with { opportunityGuid, playbookGuid } → feed state back with newAnswers each turn → stop when ready_to_finalize is true.
⚠️ Host availability. This endpoint only exists on DealHub backends that have the resolve loop deployed (currently dev backends, e.g.http://localhost:9000). Against a host that lacks it — including production hosts likeservice-us1.dealhub.io— the API returns its HTML 404 page and the tool reports "Endpoint not available on this host." PointDEALHUB_API_BASE_URLat a backend that serves it.
Finalizes a quote from a resolved state — a terminal resolve pass that persists a Draft quote. Call once resolve_quote reports ready_to_finalize: true, passing the latest state blob. Identity (opportunity / playbook / version) and all answers come from the blob; the only required field is state. Optional overrides: quoteName, docType (PDF / WORD / EXCEL / DealHub), outputDocumentGUID, proposalExpiration (epoch millis).
Returns the created quote — quote_guid, quote_num, quote_name, identifier, and status (Draft). If mandatory answers are still missing, the API returns 422 with missing_mandatory listing the unanswered paths.
npm run devnpm run buildnpm run cleanThe MCP server uses DealHub's existing OpenAPI endpoints with ByApiToken authentication:
webserver/app/com/valooto/api/auth/ByApiToken.javawebserver/app/controllers/openApi/OpenAPIVersionController.javawebserver/conf/api.routes| Tool | HTTP Method | Endpoint | Controller Method |
|---|---|---|---|
| list_versions | GET | /v1/versions | getVersions() (line 590) |
| get_version | GET | /v1/version/id/:id | getVersionById() (line 669) |
| get_version | GET | /v1/version/name/:name | getVersionByName() (line 633) |
| get_active_version | GET | /v1/versions?status=ACTIVE | getVersions() (line 590) |
| activate_version | POST | /v1/version/activate | activateVersion() (line 766) |
| duplicate_version | POST | /v1/version/duplicate | duplicateVersion() (line 703) |
| resolve_quote | POST | /v1/quote/resolve | OpenAPIQuoteResolverController.resolve |
| finalize_quote | POST | /v1/quote/finalize | OpenAPIHeadlessProposalController |
The quote resolve-loop endpoints (/v1/quote/resolve,/v1/quote/finalize) are only available on backends where that loop is deployed.
.envclientId:clientSecretDEALHUB_API_BASE_URL is correctclaude_desktop_config.json is absolute (not relative)dist/index.js exists (run npm run build)~/Library/Logs/Claude/npm run clean
npm install
npm run buildThe DealHub Admin MCP Server does not collect, store, or transmit any user data except as necessary to communicate with your DealHub instance.
This MCP server accesses the following data from your DealHub instance:
.env file on your machine. This file never leaves your computer.DEALHUB_API_BASE_URL)..env file.env file removes all stored credentials.env file until you delete them.env file.env file is excluded from version control via .gitignore.env (e.g., chmod 600 .env)This MCP server:
API Token Protection
.env files, never in code.env to .gitignore to prevent accidental commitschmod 600 .envToken Rotation
npm audit regularly to check for vulnerabilitiesnpm updateClaude Desktop Config
claude_desktop_config.json~/Library/Application Support/Claude/Environment Variables
package.json or source code.env files for local developmentIf you suspect a token has been compromised:
.env file with the new tokenFor issues or questions:
MIT License - See LICENSE file for details.
Copyright (c) 2026 DealHub
This software is provided "as is", without warranty of any kind. See the LICENSE file for full terms.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.