{"name":"io.github.Achlesha/sendhustle-mcp","slug":"achlesha-sendhustle-mcp","title":null,"description":"Send and manage email via the SendHustle API — emails, domains, contacts, audiences, campaigns.","url":"https://mcp.market/server/achlesha-sendhustle-mcp","rating":null,"grade":"C","score":55,"certified":false,"status":"active","category":"email","tags":["email"],"presence":{"score":11,"stars":null,"forks":null,"downloads_week":33,"last_push_at":null,"license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/Achlesha/SendHustle","website":"https://www.sendhustle.com","version":"1.0.2","remotes":[],"packages":[{"registryType":"npm","identifier":"sendhustle-mcp","version":"1.0.2","transport":{"type":"stdio"},"environmentVariables":[{"description":"SendHustle API key (create one at https://www.sendhustle.com/docs/api-keys/overview)","isRequired":true,"format":"string","isSecret":true,"name":"SENDHUSTLE_API_KEY"},{"description":"Default sender address on a verified domain (optional)","format":"string","name":"SENDER_EMAIL_ADDRESS"}]}],"tools":[{"name":"add_automation_step","description":"Append a step to an automation (POST /automations/:id/steps).","write_action":false,"price_micros":0,"input_schema":null},{"name":"add_contact_to_segment","description":"Add a contact to a segment (POST /contacts/:id/segments/:segmentId).","write_action":false,"price_micros":0,"input_schema":null},{"name":"apply_domain_dns_cloudflare","description":"Apply a domain's DNS records via the Cloudflare API, then auto-verify (POST /domains/:id/dns/cloudflare). Requires a scoped Zone.DNS:Edit token.","write_action":false,"price_micros":0,"input_schema":null},{"name":"apply_domain_dns_godaddy","description":"Apply a domain's DNS records via the GoDaddy API, then auto-verify (POST /domains/:id/dns/godaddy).","write_action":false,"price_micros":0,"input_schema":null},{"name":"apply_domain_dns_namecheap","description":"Apply a domain's DNS records via the Namecheap API, then auto-verify (POST /domains/:id/dns/namecheap). Namecheap requires the calling server's IP to be whitelisted on the account.","write_action":false,"price_micros":0,"input_schema":null},{"name":"cancel_campaign","description":"Cancel a scheduled campaign, returning it to draft (POST /campaigns/:id/cancel).","write_action":true,"price_micros":0,"input_schema":null},{"name":"cancel_email","description":"Cancel a scheduled email before it sends (POST /emails/:id/cancel).","write_action":true,"price_micros":0,"input_schema":null},{"name":"check_domain_mx","description":"MX preflight for a hostname before enabling receiving (GET /domains/mx-check). Returns { has_mx, ours, records } — whether the hostname already has MX records and whether they all point at our inbound host.","write_action":false,"price_micros":0,"input_schema":null},{"name":"claim_domain","description":"Claim a domain already verified elsewhere (POST /domains/claim). Returns a TXT record to add.","write_action":false,"price_micros":0,"input_schema":null},{"name":"create_audience","description":"Create an audience — a named list of contacts (POST /audiences).","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_automation","description":"Create an automation triggered by an event (POST /automations). Every automation belongs to one sending domain — only send_event calls with the same domain trigger it. Optionally pass an inline step graph (steps + connections).","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_campaign","description":"Create a campaign targeting a sending domain's contact pool (POST /campaigns, domain-first). Send it later with send_campaign.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_contact","description":"Create a contact in a sending domain's contact pool (POST /contacts, domain-first). The same address on two domains is two records with separate consent.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_contact_property","description":"Create a custom contact property / merge tag (POST /contact-properties). type is 'string' or 'number'. Idempotent on key: if a property with the same key already exists, returns that property (with already_existed: true) instead of an error.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_domain","description":"Create a sender domain (POST /domains). The response includes DNS records you must add at your DNS provider before verifying.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_segment","description":"Create a segment on a sending domain (POST /segments, domain-first). Segment names are unique WITHIN a domain but reusable across domains. filter supports { status, email_contains, property_filters }.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_template","description":"Create a reusable email template (POST /templates). Supports subject/html/text with {{ variables }} and optional variable definitions.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_topic","description":"Create a subscription topic on a sending domain (POST /topics, domain-first). default_subscription is 'opt_in' or 'opt_out'; visibility is 'public' or 'private'.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_webhook","description":"Create a webhook endpoint (POST /webhooks). The signing secret is returned ONCE on create — store it.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_audience","description":"Delete an audience and its contacts (DELETE /audiences/:id).","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_automation","description":"Delete an automation (DELETE /automations/:id).","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_automation_step","description":"Delete a step from an automation (DELETE /automations/:id/steps/:stepId). Stop (disable) the automation first if it is enabled.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_campaign","description":"Delete a campaign (DELETE /campaigns/:id).","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_contact","description":"Delete a contact by id or email (DELETE /contacts/:id). Pass `domain` when addressing by EMAIL (picks the pool).","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_contact_property","description":"Delete a contact property (DELETE /contact-properties/:id).","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_domain","description":"Delete a domain (DELETE /domains/:id).","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_received_email","description":"Permanently delete a received email, including its stored raw message and attachments (DELETE /emails/receiving/:id). This cannot be undone.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_segment","description":"Delete a segment (DELETE /segments/:id).","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_template","description":"Delete a template (DELETE /templates/:id).","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_topic","description":"Delete a topic (DELETE /topics/:id).","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_webhook","description":"Delete a webhook (DELETE /webhooks/:id).","write_action":true,"price_micros":0,"input_schema":null},{"name":"detect_domain_dns","description":"Detect a domain's DNS provider and the one-click apply methods available (GET /domains/:id/dns/detect).","write_action":false,"price_micros":0,"input_schema":null},{"name":"duplicate_template","description":"Duplicate a template (POST /templates/:id/duplicate).","write_action":false,"price_micros":0,"input_schema":null},{"name":"forward_received_email","description":"Forward a received email to other recipients (POST /emails/receiving/:id/forward). \"from\" must be a verified sending address; defaults to the configured sender.","write_action":true,"price_micros":0,"input_schema":null},{"name":"get_audience","description":"Retrieve an audience by id (GET /audiences/:id).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_automation","description":"Retrieve an automation, including its step graph (GET /automations/:id).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_automation_run","description":"Retrieve a single automation run, including its step-by-step trace (GET /automations/:id/runs/:runId).","write_action":true,"price_micros":0,"input_schema":null},{"name":"get_campaign","description":"Retrieve a campaign by id (GET /campaigns/:id).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_campaign_ab","description":"A/B winner evaluation for an A/B-test campaign (GET /campaigns/:id/ab).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_campaign_stats","description":"Per-campaign analytics — counts, engagement rates, and top clicked links (GET /campaigns/:id/stats).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_contact","description":"Retrieve a contact (GET /contacts/:id). A contact id is exact; an EMAIL can exist in several domains' pools, so pass `domain` to pick the pool.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_contact_property","description":"Retrieve a contact property by id (GET /contact-properties/:id).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_contact_topics","description":"Get a contact's topic subscriptions (GET /contacts/:id/topics).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_domain","description":"Retrieve a domain, including its DNS records and verification status (GET /domains/:id).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_domain_claim","description":"Retrieve the current claim (and its TXT verification record) for a placeholder domain (GET /domains/:id/claim).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_email_attachment","description":"Retrieve metadata for one attachment of a sent email (GET /emails/:id/attachments/:attachmentId). Returns a download_url for the file.","write_action":true,"price_micros":0,"input_schema":null},{"name":"get_poll_results","description":"Get the aggregated answer breakdown for one email's poll (GET /polls/:emailId).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_received_email","description":"Retrieve a single received email by id (GET /emails/receiving/:id).","write_action":true,"price_micros":0,"input_schema":null},{"name":"get_received_email_attachment","description":"Retrieve metadata for one attachment of a received email, including its download_url. (GET /emails/receiving/:id/attachments/:attachmentId serves the raw bytes; this tool returns the matching metadata entry from the attachment list instead.)","write_action":true,"price_micros":0,"input_schema":null},{"name":"get_received_email_raw","description":"Download the original RFC822/MIME message of a received email (GET /emails/receiving/:id/raw). Returns the raw message as text.","write_action":true,"price_micros":0,"input_schema":null},{"name":"get_segment","description":"Retrieve a segment by id (GET /segments/:id).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_template","description":"Retrieve a template by id (GET /templates/:id).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_topic","description":"Retrieve a topic by id (GET /topics/:id).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_webhook","description":"Retrieve a webhook by id (GET /webhooks/:id).","write_action":false,"price_micros":0,"input_schema":null},{"name":"import_contacts_batch","description":"Bulk-import contacts from a JSON array (POST /audiences/:id/contacts/batch). Upserts by email; max 10,000 per call. Each contact: { email, first_name?, last_name?, unsubscribed?, properties? }.","write_action":false,"price_micros":0,"input_schema":null},{"name":"import_contacts_csv","description":"Bulk-import contacts from CSV text (POST /audiences/:id/contacts/import). Header row optional; the email column is required. Non-builtin columns auto-register as custom properties unless create_properties is false. Max 5 MB / 10,000 rows.","write_action":false,"price_micros":0,"input_schema":null},{"name":"import_sheet_contacts","description":"Import contacts from a link-shared Google Sheet (POST /audiences/:id/contacts/import-sheet). Sheet headers become contact properties usable as {{merge_tags}}; rows land in a fresh segment.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_audiences","description":"List audiences (GET /audiences).","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_automation_runs","description":"List an automation's runs (GET /automations/:id/runs). Filter with status (comma-separated: running,completed,failed,cancelled,skipped).","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_automations","description":"List automations (GET /automations).","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_campaigns","description":"List campaigns (GET /campaigns).","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_contact_properties","description":"List contact properties (GET /contact-properties).","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_contact_segments","description":"List the segments a contact belongs to (GET /contacts/:id/segments).","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_contacts","description":"List a sending domain's contacts (GET /contacts?domain=..., domain-first). Optional segment_id restricts to that segment's members.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_domains","description":"List sender domains (GET /domains).","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_email_attachments","description":"List a sent email's attachments (GET /emails/:id/attachments).","write_action":true,"price_micros":0,"input_schema":null},{"name":"list_emails","description":"List sent emails with cursor pagination (GET /emails).","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_polls","description":"List emails that have in-email poll responses, with per-email counts (GET /polls).","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_received_email_attachments","description":"List a received email's attachments as metadata with download URLs (GET /emails/receiving/:id/attachments).","write_action":true,"price_micros":0,"input_schema":null},{"name":"list_received_emails","description":"List inbound (received) emails with cursor pagination (GET /emails/receiving).","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_segment_contacts","description":"Preview the contacts a segment currently resolves to (GET /segments/:id/contacts).","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_segments","description":"List a sending domain's segments (GET /segments?domain=...). Every domain includes an auto-created \"General\" (all contacts) segment.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_templates","description":"List templates (GET /templates).","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_topics","description":"List a sending domain's subscription topics (GET /topics?domain=...).","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_webhooks","description":"List webhooks (GET /webhooks).","write_action":false,"price_micros":0,"input_schema":null},{"name":"publish_template","description":"Publish a template, making its latest draft live (POST /templates/:id/publish).","write_action":true,"price_micros":0,"input_schema":null},{"name":"remove_contact_from_segment","description":"Remove a contact from a segment (DELETE /contacts/:id/segments/:segmentId).","write_action":true,"price_micros":0,"input_schema":null},{"name":"reply_received_email","description":"Reply to a received email's sender, threaded into the same conversation (POST /emails/receiving/:id/reply). `from` must be on a verified domain.","write_action":true,"price_micros":0,"input_schema":null},{"name":"retrieve_email","description":"Retrieve a sent email and its events by id (GET /emails/:id).","write_action":true,"price_micros":0,"input_schema":null},{"name":"rotate_webhook_secret","description":"Rotate a webhook signing secret (POST /webhooks/:id/rotate). The new secret is returned ONCE; the old secret stops verifying immediately.","write_action":false,"price_micros":0,"input_schema":null},{"name":"send_batch_emails","description":"Send up to 100 emails in one request (POST /emails/batch). Pass an array of email objects, each with from/to/subject and html and/or text. Per-email \"from\" defaults to the configured sender if omitted.","write_action":true,"price_micros":0,"input_schema":null},{"name":"send_campaign","description":"Send a campaign now, or schedule it with scheduled_at (POST /campaigns/:id/send).","write_action":true,"price_micros":0,"input_schema":null},{"name":"send_email","description":"Send a single email through SendHustle (POST /emails). Supports HTML and/or plain text, CC/BCC, reply-to, scheduling, attachments, tags, and custom headers. The \"from\" address must be on a verified domain; if omitted, the server default sender is used.","write_action":true,"price_micros":0,"input_schema":null},{"name":"stop_automation","description":"Stop an automation — prevents new runs; in-progress runs finish (POST /automations/:id/stop).","write_action":false,"price_micros":0,"input_schema":null},{"name":"test_webhook","description":"Send a synchronous test delivery and return the endpoint's live result (POST /webhooks/:id/test).","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_audience","description":"Rename an audience (PATCH /audiences/:id).","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_automation","description":"Update an automation's name, status, domain, or connection graph (PATCH /automations/:id). Enabling requires at least one step; editing connections or the domain requires the automation to be disabled.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_automation_step","description":"Update a step in place (PATCH /automations/:id/steps/:stepId). The graph key stays stable, so connections keep pointing at it. Disable the automation first if it is enabled.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_campaign","description":"Update a draft campaign's content or targeting (PATCH /campaigns/:id).","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_contact","description":"Update a contact by id or email (PATCH /contacts/:id). Pass `domain` when addressing by EMAIL (picks the pool).","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_contact_property","description":"Update a contact property's fallback value (PATCH /contact-properties/:id). key/type are immutable.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_contact_topics","description":"Update a contact's topic subscriptions (PATCH /contacts/:id/topics). Provide topics as an array of { id, subscription: 'opt_in' | 'opt_out' }.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_domain","description":"Update a domain's tracking/TLS/capabilities settings (PATCH /domains/:id).","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_email","description":"Reschedule a scheduled email by setting a new send time (PATCH /emails/:id).","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_segment","description":"Update a segment's name or filter (PATCH /segments/:id).","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_template","description":"Update a template (PATCH /templates/:id).","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_topic","description":"Update a topic (PATCH /topics/:id).","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_webhook","description":"Update a webhook's endpoint, events, or status (PATCH /webhooks/:id).","write_action":true,"price_micros":0,"input_schema":null},{"name":"verify_domain","description":"Trigger verification of a domain after its DNS records are in place (POST /domains/:id/verify).","write_action":false,"price_micros":0,"input_schema":null},{"name":"verify_domain_claim","description":"Trigger DNS verification for a pending domain claim (POST /domains/:id/claim/verify).","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":55,"grade":"C","scanned_at":"2026-09-19T19:27:46.631Z","report":{"scannerVersion":"0.1.5","scannedAt":"2026-09-19T19:27:46.617Z","components":{"code":{"score":25,"max":25,"notes":["11 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":3,"max":15,"notes":["repository not readable: repo not found"]},"identity":{"score":2,"max":10,"notes":["no repository or website to verify"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"sendhustle-mcp","version":"1.0.2","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":0,"publishedAt":"2026-09-17T04:24:12.945Z","repositoryUrl":"git+https://github.com/Achlesha/SendHustle.git","weeklyDownloads":33}],"repo":{"found":false,"owner":"Achlesha","repo":"SendHustle","error":"repo not found"},"icon":{"url":"https://sendhustle.com/icon.svg?58bd16f71a5124eb","source":"registry"},"presence":{"stars":null,"forks":null,"downloadsWeek":33,"license":"MIT","lastPushAt":null,"score":11}}}},"grade_history":[],"reviews":[]}