OpenSDR
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| EXA_API_KEY | No | Optional. Exa API key, an alternative to Tavily. | |
| OPENSDR_DEMO | No | Set to 1 to force demo mode (fictional data, no network calls). | |
| APOLLO_API_KEY | No | Optional. Apollo API key for people/company search and enrichment. | |
| HUNTER_API_KEY | No | Optional. Hunter API key for email finding and verification. | |
| TAVILY_API_KEY | No | Optional. Tavily API key for buying signals and account research. | |
| OPENSDR_DATA_DIR | No | Local data directory (default ~/.opensdr). | |
| INSTANTLY_API_KEY | No | Optional. Instantly API v2 key for draft campaigns and lead enrollment. | |
| OPENSDR_READ_ONLY | No | Set to 1 to block all external writes (campaigns, CRM). | |
| HUBSPOT_ACCESS_TOKEN | No | Optional. HubSpot private-app token for contact sync. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
| completions | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| sdr_provider_statusA | Reports which providers are configured, the current mode (live or demo), read-only state, the data directory, per-capability provider resolution, session credit estimate and the active limits. Free and local: makes no network calls. Use it first to see what OpenSDR can do and which env vars are missing. Does not reveal API key values, not even partially. |
| sdr_lookup_filtersA | Look up normalized filter values for Apollo searches: seniority, employee_range, revenue_range, department, title or industry. Free and local: no network call, no credits. Use it before sdr_search_people or sdr_search_companies to turn plain-English ICP terms into exact values (for example query "vp eng" returns "VP Engineering"). Returns up to |
| sdr_search_peopleA | Search for people (prospects) by title, seniority, location, company domain or size. Free: the Apollo People API Search consumes no credits. Does NOT return emails or phones — use sdr_waterfall_enrich_person on the people you want. Requires at least one filter. Results are paginated with an opaque |
| sdr_search_companiesA | Search for companies by industry, keywords, size, location, technology or domain. Consumes Apollo credits (~1 credit per page); the call is checked against the per-call credit budget first. Requires at least one filter. Paginated with an opaque |
| sdr_waterfall_enrich_personA | Find and verify a work email for people through a cost-aware waterfall: Apollo match -> Hunter finder -> optional Hunter verifier -> free local checks (syntax, MX, disposable, role). Paid tiers stop when the budget runs out. Returns each person with an email status, confidence, and a |
| sdr_enrich_companyA | Enrich up to 10 company domains with firmographics (industry, headcount, location, technologies, funding) via Apollo organization enrichment. Consumes ~1 Apollo credit per domain; checks the per-call budget first and caches results. Use it after sdr_search_people to qualify accounts, or before sdr_prepare_outreach_brief for grounded personalization. |
| sdr_verify_emailA | Check whether email addresses are deliverable. Always runs free local checks (syntax, MX, disposable domain, role address). With use_provider=true and a Hunter key, it also runs the Hunter verifier (1 credit each, cached). Returns a status (verified | likely | accept_all | unknown | invalid), a confidence, and the individual checks. Does not do SMTP probing or send anything. |
| sdr_save_prospectsA | Save or update prospects in a local named list. Accepts full person objects (deduped by email, LinkedIn URL, Apollo id, or name + domain) or { prospect_id, patch } edits. Use this to persist drafted copy (patch custom_fields.first_line) and to set status/notes/signals. Local write, no credits, no network. Suppressed people are still saved but flagged. Next: sdr_list_prospects or sdr_export_csv. |
| sdr_list_prospectsA | Query saved prospects by list, status, email status, company domain or free-text search, and optionally return a per-list summary with counts. Free, local, read-only. Use it to review a list before sdr_export_csv or sdr_push_to_campaign. Paginated with an opaque cursor. |
| sdr_export_csvA | Export prospects to a UTF-8 (BOM) CSV that opens cleanly in Excel or Sheets. Select by list or by prospect_ids. RFC 4180 quoting plus a formula-injection guard. Suppressed prospects are excluded unless include_suppressed=true. Free and local. Refuses to overwrite an existing file unless overwrite=true. Does not upload anything. |
| sdr_manage_suppressionA | Maintain the do-not-contact list (emails and domains) and check values against it. Use when a prospect opts out, bounces, or asks not to be contacted. Domains suppress their subdomains too. The suppression list is honored by every outward tool and cannot be bypassed from a tool call. Free and local. add is idempotent; remove needs the exact value. |
| sdr_detect_buying_signalsA | Find recent, sourced buying signals for companies: funding, hiring, leadership changes, product launches, acquisitions and tech changes. Returns each signal with a URL, a published date when available, a confidence and the matched rule. Consumes credits (Exa/Tavily, ~1/query) and is budgeted. IMPORTANT: |
| sdr_research_accountA | Gather cited source material about an account: firmographics from Apollo (if configured) and web results per focus area. Returns raw sources (title, url, date, excerpt) plus |
| sdr_prepare_outreach_briefA | Prepare a grounded outreach brief: seller context, per-prospect facts and top signals, a sequence framework and the rules for writing compliant copy. Free, local, read-only. It does NOT write the copy — you do. Save your drafts with sdr_save_prospects (custom_fields.first_line). Suppressed prospects are marked |
| sdr_create_campaignA | Create an Instantly campaign. OpenSDR never activates it: creation sends no activation flag, and the response reports the status Instantly returned (normally "draft"). Two-phase: call without confirm to get a preview and a confirmation_token, show the preview to the user, then call again with confirm=true and the token after explicit approval. Honors OPENSDR_READ_ONLY. Demo mode returns simulated:true and makes no HTTP call. Every email body must contain an opt-out line. |
| sdr_push_to_campaignA | Enroll prospects into an existing Instantly campaign. Only campaigns in "draft" or "paused" status are accepted, because adding leads to an active campaign starts sending. Two-phase: call without confirm to preview the campaign status and who is eligible/excluded (suppression, no email, unverified, invalid, already in campaign, over cap), show it to the user, then call again with confirm=true and the token after explicit approval. If any approved lead changes before confirming, the confirm is rejected and you must preview again. Only verified/likely emails are enrolled unless allow_unverified (which still never allows suppressed or invalid). Honors OPENSDR_READ_ONLY. Demo mode returns simulated:true. |
| sdr_sync_hubspotA | Upsert prospects into HubSpot as contacts (keyed by email), with an optional lifecycle stage and a note. Two-phase: call without confirm to preview, show the preview to the user, then call again with confirm=true and the confirmation_token after explicit approval. If any approved contact changes before confirming, the confirm is rejected and you must preview again. Idempotent by email (re-syncing never duplicates). overwrite_existing:false (default) only fills empty HubSpot properties. Suppressed prospects are excluded unless include_suppressed. Honors OPENSDR_READ_ONLY. Demo mode returns simulated:true. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| autonomous_sdr_workflow | End-to-end prospecting run: find prospects for an ICP, enrich them within a credit budget, find buying signals, draft grounded outreach, and optionally stage a campaign. Stops for your approval before spending credits, before saving drafts, and before every write. |
| icp_prospecting | Turn an ideal customer profile into precise searches, show matching prospects in a table, and save only the ones you approve. Does not spend enrichment credits. |
| cold_outreach_sequence | Draft a grounded multi-touch sequence and per-prospect first lines from an outreach brief, show them for approval, then save them. Never creates or pushes a campaign. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| providers | Mode, configured providers, capabilities, limits and session credits. |
| lists | Every saved prospect list with counts by email and pipeline status. |
| profile | Your product, ideal customer and proof points (profile.md), used by outreach briefs. |
TDQS
Scored across 17 tools
Each tool targets a distinct phase of the SDR pipeline (status, filter lookup, search, enrich, verify, persist, export, suppress, research, campaign, CRM sync), and the descriptions explicitly state boundaries and hand-offs. Near-neighbors like sdr_waterfall_enrich_person vs sdr_verify_email, and sdr_research_account vs sdr_detect_buying_signals, are clearly differentiated by scope ('find+verify' vs 'verify only'; 'cited firmographics' vs 'signals').
Every tool uses the same sdr_ prefix with snake_case and a consistent verb/noun shape (search_people, enrich_company, save_prospects, create_campaign). The one slightly awkward name, sdr_waterfall_enrich_person, still fits the overall convention rather than breaking it.
17 tools is reasonable for an end-to-end outreach pipeline spanning multiple providers (Apollo, Hunter, Exa/Tavily, Instantly, HubSpot). Each tool maps to a necessary lifecycle step with no obvious redundancy, so none feels gratuitous.
Coverage is strong: search, multi-tier enrichment, verification, persistence, CSV export, suppression, signals, research, brief prep, campaign creation/enrollment, and CRM sync are all present. Minor gaps remain — no campaign listing/fetch, no prospect deletion, and no direct removal/read of full campaign state — but agents can work around these.