# Bullpen

> AI sales team that works the phone: gets a real person on the line. Agents sign up by paying (MPP).

- name: sale.bullpen/bullpen
- version: 1.0.2
- connection class: R0 (autonomous)
- trust: 96/100
- quality: 75/100 (good)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/sale.bullpen%2Fbullpen
- tools: https://api.protogrid.dev/v1/servers/sale.bullpen%2Fbullpen/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "bullpen": {
      "type": "http",
      "url": "https://bullpen.sale/mcp"
    }
  }
}
```


## Trust

- hygiene: 100
- liveness: 100
- freshness: 100
- provenance: 85
- drivers: +repository +dns-namespace +website +reachable +uptime-100% +updated-9d-ago
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 75/100 (good)

### protocol: 75 (weight 25)

- warn `protocol.modern`: newest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
- n/a `protocol.stateless`: only applies to 2026-07-28 servers
- pass `protocol.transport`: streamable HTTP
- n/a `protocol.list_ttl`: only applies to 2026-07-28 servers

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 88 (weight 30)

- pass `tools.descriptions`: every tool has a description
- pass `tools.description_length`: descriptions are concise
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 42 of 42 tools declare readOnlyHint or destructiveHint
- fail `tools.directory_hints`: no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: connect_google (idempotentHint); whoami (destructiveHint, idempotentHint); list_team (destructiveHint, idempotentHint); …
- pass `tools.token_cost`: about 4,831 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump
- pass `tools.hidden_text`: no hidden text in tool names, descriptions, schemas or annotations

### stability: 50 (weight 15)

- warn `stability.changes`: 31 tool changes in 30 days
- fail `stability.rug_pull`: 5 tools kept their name but changed most of their description in 30 days; review before trusting them
- pass `stability.new_links`: no tool change named a new site

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 42, about 4,831 tokens to load them all
- tool set hash: db42bf7ce2622dbb078318a569b179a6
- tools last changed: 2026-11-13T20:17:27.333Z
- badge: [![protogrid quality](https://protogrid.dev/badge/sale.bullpen/bullpen.svg)](https://protogrid.dev/servers/sale.bullpen/bullpen)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

- 2026-11-13 `set_mobile` changed (description)
  - before: Set the mobile that rings when the crew reaches a person (get_a_human). Yours by default; managers can set a teammate's with user_id (from list_team).
  - after: Set the mobile that rings when the crew reaches a person (get_a_human). This is your number for every call in the workspace; to send one campaign's live handoffs to someone else, set handoff_number with set_campaign_customs instead. Yours by default; managers can set a teammate's with user_id (from list_team).
- 2026-11-13 `set_campaign_customs` changed (description) **meaning changed**
  - before: Override customs for one campaign (admin only): tone, opening, closing, say, never_say, customs, knock_line. For a campaign that should sound different from the team default — another market, region or offer. Null returns a key to the team default.
  - after: Override how one campaign sounds and who it is (admin only). Customs: tone, opening (said as the first line; {name} and {team} fill in), closing, say, never_say, customs, knock_line. Identity, for a campaign that calls as a different company: spoken_name, pronunciation, about, website, caller_name. Handoff: closer_name and handoff_number, the person and phone that ring when a live prospect wants a human on this campaign's calls (instead of the workspace's human line). Null returns a key to the team default.
- 2026-11-13 `work_campaign` changed (description, inputSchema) **meaning changed**
  - before: Send the crew to work a campaign's contacts now. Spends credits.
  - after: Send the crew to work a campaign now. With only the campaign id it takes the reachable contacts not yet in a play (company lines, not excluded), easiest first, up to limit (default 10, max 25), and switches a paused campaign on. Pass contact_ids to choose. Spends credits.
- 2026-11-13 `list_campaign_contacts` added
  - Every contact in a campaign with its status (new, researched, excluded), phone, line type and whether it is already in a play.
- 2026-11-13 `create_campaign` changed (description) **meaning changed**
  - before: Start a calling campaign. Add contacts with import_campaign_contacts, then work_campaign.
  - after: Create a calling campaign. It starts paused: add contacts (import_campaign_contacts, or find_companies with campaign_id), set its customs, then work_campaign switches it on.
- 2026-11-13 `find_companies` changed (description, inputSchema) **meaning changed**
  - before: Search for companies to sell to (e.g. 'HVAC companies in Salt Lake City'). Returns names, main phone lines and websites.
  - after: Search for companies to sell to (e.g. 'HVAC companies in Salt Lake City'). Returns each company's id, name, main phone line, website, city and state. Pass campaign_id to add them to that campaign's contact list in the same call.
- 2026-11-08 `delete_call` added
  - Delete the transcript, summary and recording of one call, for good (a deletion request from the person called, or your team's retention policy). The call row, its outcome and its cost remain. Reps can delete their own calls; managers and admins any.
- 2026-11-07 `rename_crew_member` added
  - Rename a crew member for the team's culture or region, optionally with a new voice, persona or greeting. Admin only; paid workspaces (402 otherwise — buy_credits first). Keys from list_team's crew or onboarding_status.
- 2026-11-07 `set_campaign_customs` added
  - Override customs for one campaign (admin only): tone, opening, closing, say, never_say, customs, knock_line. For a campaign that should sound different from the team default — another market, region or offer. Null returns a key to the team default.
- 2026-11-07 `set_team_profile` added
  - Save the team profile (admin only). Pass only fields your person approved: spoken_name, pronunciation, about, website, trademarks [{name, say_as}], tone, opening, closing, say [], never_say [], customs (house rules, prose), knock_line ({name} = crew member's first name, {team} = company), caller_name (≤15 chars). It shapes how the crew sounds; it cannot change the rules (the crew says it's an AI when asked, keeps to calling hours, honours do-not-call, invents nothing).

Full history: https://api.protogrid.dev/v1/servers/sale.bullpen%2Fbullpen/changes

## Remotes

- https://bullpen.sale/mcp (streamable-http, auth none, reachable true, uptime30d 1)

## Packages

_none_

## Tools (42)

- `accept_outbound_agreement`: Accept the agreement on your person's behalf ONLY after they have read it and told you they agree. Requires their full name as they typed it; recorded with this connection. Admin or manager only.
- `ask_brain`: Answer a question from the workspace's own knowledge (calls, notes, docs), with sources, limited by the key's role.
- `ask_herman`: Talk to Herman, the manager agent who runs the whole bullpen in plain language: status, finding companies, running campaigns, sending the crew to call. Anything that reaches the outside world comes back as a pending action with an id — nothing goes out until confirm_herman_action.
- `bullpen_about`: What Bullpen does, what it costs, and how to get a workspace: free with $10 of credits (no card) when your person signs in, or by paying over MPP. Call this first if you have no key. (No API key needed.)
- `bullpen_signup`: Start creating a Bullpen workspace for your principal by paying with the Machine Payments Protocol (MPP, Stripe). Returns the 402 payment challenge and the exact URL to retry with your MPP client (e.g. `npx @stripe/link-cli mpp pay <url>`). The paid retry returns an api_key; pass it to this MCP server as `Authorization: Bearer bp_live_…`. $25–$500, all of it becomes credits, plus $10 free. (No API key needed.)
- `buy_credits`: A Stripe Checkout link your person opens to add credits by card ($20–$10,000). Agents with a wallet can use top_up_credits instead.
- `buy_number`: Buy a number: $3/month from prepaid credits (first month charged now). Default is a crew line, and a crew member is put on it right away; for:"me" makes it your person's own caller ID instead. Admin or manager only. Confirm with your person before buying.
- `confirm_herman_action`: Run or drop a pending action Herman proposed (a call, text or Salesforce update). Only confirm what your principal actually wants.
- `connect_google`: A link your person opens to approve Google Calendar and Gmail, for booking meetings and sending mail.
- `connect_salesforce`: A link your person opens to approve Bullpen in Salesforce, so every call writes there. Admin or manager only.
- `create_campaign`: Create a calling campaign. It starts paused: add contacts (import_campaign_contacts, or find_companies with campaign_id), set its customs, then work_campaign switches it on.
- `credits_status`: Prepaid credit balance and recent usage. Spending tools return a 402 error at zero.
- `delete_call`: Delete the transcript, summary and recording of one call, for good (a deletion request from the person called, or your team's retention policy). The call row, its outcome and its cost remain. Reps can delete their own calls; managers and admins any.
- `draft_team_profile`: Draft a team profile from the company's website and any notes from your person. Returns a draft and its sources; nothing is saved. Walk your person through it — name as spoken, product names, tone, words to use and avoid, house rules, the knock line — and save what they approve with set_team_profile.
- `find_companies`: Search for companies to sell to (e.g. 'HVAC companies in Salt Lake City'). Returns each company's id, name, main phone line, website, city and state. Pass campaign_id to add them to that campaign's contact list in the same call.
- `floor_state`: Live and recent crew calls.
- `get_a_human`: A crew member dials the number, works the phone menu, hold and AI receptionist until a real person answers, then connects the key's owner into the live call. Spends credits ($0.30 per crew minute; no extra charge when a person is reached). Company lines only unless the callee gave written consent.
- `get_call_transcript`: One call in full: the transcript as text and as timed lines with speakers (crew, the person reached, and your person after a handoff), the summary, outcome, and a signed recording link (MP3, valid one hour). Pass an id or call SID from list_calls.
- `get_outbound_agreement`: The full Outbound Compliance Agreement and its version. Show it to your person before accept_outbound_agreement; calls and texts stay locked until it's accepted.
- `get_team_profile`: The team profile the crew works from: company name as spoken, what the team sells, trademarks and how to say them, tone, how calls open and close, words to use and never use, house rules, the knock line, caller-ID name, and per-campaign overrides. Read it first; if is_set is false, offer to build it with draft_team_profile.
- `hire_crew`: Put an AI crew member (name, voice, role) on every free phone line so the crew can dial. Run after a number is bought.
- `import_campaign_contacts`: Add contacts to a campaign from CSV text (header row: company, phone, name, title, email).
- `invite_teammate`: Invite someone to the workspace by email; they get a sign-in link that lands on the join page. Roles: rep, manager, admin (only admins invite admins).
- `knock`: Reach a human at a company's main line and leave a short hello pointing to your principal. Business hours, once a week per company. Spends credits.
- `list_calls`: Recent calls, newest first: id, call SID, when, number, crew member, whether it was handed to your person, outcome, summary, and whether a transcript and recording exist. Reps see their own calls; managers and admins see all.
- `list_campaign_contacts`: Every contact in a campaign with its status (new, researched, excluded), phone, line type and whether it is already in a play.
- `list_team`: Members (role, whether their mobile is set, Herman on) and pending invites with their links.
- `onboarding_status`: Checklist of what this workspace still needs before every feature works (Herman, compliance agreement, phone number, crew, your mobile, credits, Salesforce, Google, texting, team), in the order to do them, with the tool or link for each. Start here after signing up.
- `open_page`: A link your person can open: floor (the live floor: who's on a call right now, and recent calls); human_line (Human line: your mobile and live bridge calls); herman (the app home, with Herman in the corner); campaigns (campaigns); companies (companies found and researched); integrations (phone numbers, texting registration, Salesforce and Google); billing (credits, billing and the Outbound Compliance Agreement); team (members and invites); api_keys (API keys and agent connections (revoke here)). "floor" is the live floor to watch calls. (No API key needed.)
- `rename_crew_member`: Rename a crew member for the team's culture or region, optionally with a new voice, persona or greeting. Admin only; paid workspaces (402 otherwise — buy_credits first). Keys from list_team's crew or onboarding_status.
- `research_company`: Who to ask for at a company returned by find_companies.
- `search_numbers`: Available US numbers by area code, for the crew's lines.
- `send_email`: Email from the workspace's agent inbox.
- `send_text`: Text from the workspace's line. Opt-outs are honored. Spends credits.
- `set_campaign_customs`: Override how one campaign sounds and who it is (admin only). Customs: tone, opening (said as the first line; {name} and {team} fill in), closing, say, never_say, customs, knock_line. Identity, for a campaign that calls as a different company: spoken_name, pronunciation, about, website, caller_name. Handoff: closer_name and handoff_number, the person and phone that ring when a live prospect wants a human on this campaign's calls (instead of the workspace's human line). Null returns a key to the team default.
- `set_mobile`: Set the mobile that rings when the crew reaches a person (get_a_human). This is your number for every call in the workspace; to send one campaign's live handoffs to someone else, set handoff_number with set_campaign_customs instead. Yours by default; managers can set a teammate's with user_id (from list_team).
- `set_team_profile`: Save the team profile (admin only). Pass only fields your person approved: spoken_name, pronunciation, about, website, trademarks [{name, say_as}], tone, opening, closing, say [], never_say [], customs (house rules, prose), knock_line ({name} = crew member's first name, {team} = company), caller_name (≤15 chars). It shapes how the crew sounds; it cannot change the rules (the crew says it's an AI when asked, keeps to calling hours, honours do-not-call, invents nothing).
- `top_up_credits`: Start an MPP credit top-up ($5–$500). Returns the 402 challenge and the URL to pay and retry with your MPP client, sending your key as X-Bullpen-Key.
- `turn_on_herman`: Switch Herman on for this member so ask_herman works.
- `watch_companies`: Add companies to Social Intel, which scans them for buying and risk signals.
- `whoami`: The workspace, member and role this API key acts as.
- `work_campaign`: Send the crew to work a campaign now. With only the campaign id it takes the reachable contacts not yet in a play (company lines, not excluded), easiest first, up to limit (default 10, max 25), and switches a paused campaign on. Pass contact_ids to choose. Spends credits.
