Skip to content
MCP Server

MCP Server

Vulnotes includes a built-in MCP (Model Context Protocol) server that exposes your pentest reports, findings, templates, and more to AI assistants like Claude.

The MCP server is hosted alongside your Vulnotes instance at /mcp, no additional installation required.

Generating an API Key

  1. Log in to Vulnotes as an administrator
  2. Go to Settings > API & MCP
  3. Click Create API Key
  4. Give it a descriptive name (e.g., "Claude MCP")
  5. Copy the generated key

Setup with Claude Code

Run the following command to add the Vulnotes MCP server to Claude Code:

bash
claude mcp add --transport http vulnotes https://your-instance.vulnotes.app/mcp \
--header "Authorization: Bearer vuln_sk_your_api_key_here"

Replace your-instance.vulnotes.app with your actual Vulnotes domain and vuln_sk_your_api_key_here with your API key.

Available Tools

Reports

ToolDescription
list_reportsList all reports with optional filtering by status or search
get_reportGet detailed report including findings and content
create_reportCreate a new report from a template with scope entries
update_reportUpdate report metadata (title, status, dates, scope)
update_report_contentUpdate a specific content section (e.g., executive summary)
delete_reportPermanently delete a report
export_report_jsonExport a report as JSON
export_report_pdfExport a report as PDF (server-side rendered)

Findings

ToolDescription
list_findingsList all findings in a report (large HTML truncated)
get_findingGet a single finding with full content (no truncation)
get_finding_fieldsGet expected fields from the vulnerability template -call this before add_finding
add_findingAdd a new vulnerability finding (fields are validated against the template)
update_findingUpdate an existing finding (deep merge, preserves other languages)
delete_findingRemove a finding from a report
reorder_findingsChange the order of findings in a report

TIP

Findings have dynamic fields defined by the vulnerability template. Always call get_finding_fields first to understand what fields are expected, their types, and which are required. Field IDs and value types are strictly validated.

Templates & Companies

ToolDescription
list_templatesList available report templates
get_templateGet template details including fields
list_companiesList all companies/clients
get_companyGet company details
create_companyCreate a new company with contacts
update_companyUpdate company name or contacts
delete_companyDelete a company

Vulnerability Library

ToolDescription
search_vulnerabilitiesSearch the vulnerability library
get_vulnerabilityGet vulnerability details
create_vulnerabilityCreate a new vulnerability in the library
update_vulnerabilityUpdate an existing vulnerability
delete_vulnerabilityDelete a vulnerability from the library

Notes

ToolDescription
list_notesList all notes for a report
create_noteCreate a markdown note with tags and pin support
get_noteGet a specific note
update_noteUpdate a note
delete_noteDelete a note
toggle_note_pinPin or unpin a note

Images & Attachments

ToolDescription
upload_imageUpload an image for use in richtext fields
upload_attachmentUpload a file attachment (PDF, evidence, etc.)
list_attachmentsList all attachments for a report
delete_attachmentDelete an attachment

Content Sections

ToolDescription
list_content_sectionsList template-defined sections (executive summary, methodology, etc.)
get_content_sectionGet a specific content section

Workflow Example

A typical workflow for creating a report with findings:

  1. List templates -list_templates to see available templates (ensure it has a vulnerability template linked)
  2. Create report -create_report with the chosen template ID, scope entries, and dates
  3. Get finding fields -get_finding_fields to understand what the vulnerability template expects
  4. Add findings -add_finding with the proper field IDs and values (validated against the template)
  5. Upload images -upload_image to get image paths, then embed in richtext with <img src="path" />
  6. Write sections -update_report_content to fill in executive summary, methodology, etc.
  7. Export -export_report_pdf to generate the final PDF

INFO

Templates must have a linked vulnerability template to support findings. Templates without one are for content-only reports.

Field Types

When adding findings, field values depend on their type:

TypeFormatExample
richtextHTML string"<p>A SQL injection was found...</p>"
textPlain string"Simple text"
cvssObject with vector and score{"vector": "CVSS:3.1/AV:N/AC:L/...", "score": 9.8}
tagsString array["sql-injection", "owasp-top-10"]
dropdownOne of the allowed options"High"
numberNumeric value42
checkboxBooleantrue
dateISO date string"2024-01-15"
customscoreScore object{"score": 8.5, "criteriaValues": {...}}

WARNING

Field IDs and value types are validated. Unknown field IDs, wrong types, or invalid dropdown values will be rejected with an explicit error. CVSS vectors are validated for the correct version prefix (3.1 vs 4.0).

Scope Entries

When creating or updating a report, you can define structured scope entries:

json
{
  "scopeDescription": "External penetration test",
  "scopeEntries": [
    { "type": "ip", "value": "192.168.1.0/24" },
    { "type": "url", "value": "https://app.example.com" },
    { "type": "domain", "value": "example.com" }
  ]
}

Report Status Values

Valid status values for update_report:

StatusDescription
draftReport is being written
waiting-for-reviewSubmitted for review
under-reviewCurrently being reviewed
completedFinalized report

Example Prompts

Once configured, you can ask Claude:

  • "List all my penetration testing reports"
  • "Show me the findings for report XYZ"
  • "Using this information from my nmap scan create an informative vulnerability on report X"
  • "Create a new pentest report for Acme Corp using the Standard template"
  • "What fields do I need for findings in this report?"
  • "Add an SQL Injection finding to the Acme Corp report with a CVSS score of 9.8"
  • "Update the executive summary to add the customer name for the latest report"
  • "Search for XSS vulnerabilities in the library"
  • "Upload this screenshot and add it to the finding description"
  • "Reorder the findings by severity, critical first"
  • "Create a company called TechStart with contact John Doe"
  • "Export the report as PDF"

Troubleshooting

Connection refused

  1. Verify your Vulnotes instance is running and accessible
  2. Check that the URL doesn't have a trailing slash
  3. Ensure your network/firewall allows the connection

Permission denied

Your API key may not have sufficient permissions. Ensure the user who created the key has the necessary role permissions in Vulnotes.

Token expired or invalid

API keys can be deactivated by an administrator. Check that your key is still active in Settings > API & MCP.

Field validation errors

When adding or updating findings, you may get validation errors like:

  • Unknown field - The field ID doesn't match the vulnerability template. Call get_finding_fields to see valid IDs.
  • Wrong type - The value type doesn't match (e.g., passing a number where a string is expected).
  • Missing required field - A required field was not provided when creating a finding.
  • Invalid dropdown value - The value is not in the allowed options list.