Atlas / MCP servers / extrovert-dot-dev / Extrovert JavaScript packages

Extrovert JavaScript packagesCAUTION

mcp/extrovert-dot-dev/extrovert-js

TypeScript SDK and MCP server for Extrovert

Verdict
CAUTION
Grade
B
Trust score
88 /100
Exposed tools
79 51r · 19w · 9d
Transport
stdio · streamable-http
License
MIT
Stars
0
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

Public release source for Extrovert's JavaScript integration surfaces:

  • @extrovert.dev/sdk - typed TypeScript client for the Extrovert REST API.
  • @extrovert.dev/mcp - MCP SDK v2 server with stdio and stateless Streamable HTTP transports.

Both packages share one contract version. Default commands install stable:

npm install @extrovert.dev/sdk
npx -y @extrovert.dev/mcp --help

For opt-in preview features or fixes, use npm install @extrovert.dev/sdk@next or npx --yes --prefer-online @extrovert.dev/mcp@next --help. Exact published versions provide reproducible installs. See switching channels; npm previews do not change hosted MCP or GitHub plugin skills.

The MCP package installs extrovert-mcp for MCP transports and the extrovert CLI alias for setup, authentication, inbox reads, review status, and reviewed sends. OAuth-capable clients can connect directly to the production protected resource at https://mcp.extrovert.dev/mcp; the browser flow avoids putting an Extrovert key in client config.

Remote MCP requires no local SDK or compiler. Use the published CLI when Node >=20 is already available; no TypeScript compiler, pnpm, Git, or Docker is needed at runtime. For an agent with secure HTTP execution only, use the HTTPS recipes.

extrovert review watch --wait-seconds 86400 --json waits quietly across short requests. The SDK equivalents are client.reviews.events.watch() and client.waitForActivation(); client.tasks exposes durable observer handles. Observer completion is not approval, credential exchange, or a sent message. Waiting and resumption explains the optional MCP Tasks extension and fallback behavior.

Choose Connections and access for t

Read from source at commit 6b6f585b9ba0OBSERVED · 2026-10-11
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add sdk --env ACTIONS_ID_TOKEN_REQUEST_TOKEN=${ACTIONS_ID_TOKEN_REQUEST_TOKEN} --env ACTIONS_ID_TOKEN_REQUEST_URL=${ACTIONS_ID_TOKEN_REQUEST_URL} --env EXTROVERT_API_KEY=${EXTROVERT_API_KEY} --env EXTROVERT_WEBHOOK_SECRET=${EXTROVERT_WEBHOOK_SECRET} -- npx -y @extrovert.dev/[email protected]
claude-desktop
{
  "mcpServers": {
    "sdk": {
      "command": "npx",
      "args": [
        "-y",
        "@extrovert.dev/[email protected]"
      ],
      "env": {
        "ACTIONS_ID_TOKEN_REQUEST_TOKEN": "${ACTIONS_ID_TOKEN_REQUEST_TOKEN}",
        "ACTIONS_ID_TOKEN_REQUEST_URL": "${ACTIONS_ID_TOKEN_REQUEST_URL}",
        "EXTROVERT_API_KEY": "${EXTROVERT_API_KEY}",
        "EXTROVERT_WEBHOOK_SECRET": "${EXTROVERT_WEBHOOK_SECRET}"
      }
    }
  }
}
03

Exposed tools (79)

51 read · 19 write · 9 destructive. Blast radius: 9 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
add_contact_list_entrywriteAdd an allow or block entry to an inbox
batch_update_messageswriteMark read/unread and/or move folder for a list of message ids that all belong to one inbox, in a single call.
cancel_commerce_requestreadWithdraw this agent
cancel_reviewreadWithdraw your own pending review (rr_...) to the terminal cancelled state: you decided not to send it after all.
check_suppressionreadPre-check, BEFORE you compose, whether a recipient has opted out of this org
correct_activation_emailreadCorrect the expected human email before activation. Requires the latest revision from check_activation. Clears previous email proof; the human must send a fresh message. The original 24-hour deadline stays fixed.
create_inboxwriteProvision a real, persistent inbox for this agent in one call. Omit username and domain to create an instant address on a
delete_contact_list_entrydestructiveDelete a contact-list entry by id (lst_...). The allow/block rule stops applying immediately.
delete_inboxdestructivePermanently delete an inbox and all of its messages, and tear down its sender identity. Requires mailbox:delete,
delete_messagedestructiveDelete one message by its opaque id (msg_...). By default it is moved to the Trash folder (a recoverable soft
delete_threaddestructiveDelete an entire conversation thread by its stable id (thr_...): every message in it (across INBOX and Sent). By
delete_webhookdestructiveDelete a registered webhook by id (whk_...). Deliveries stop immediately. This cannot be undone.
describe_administrative_actionreadGet the exact input JSON Schema, read/change classification, and authority required for an action_id from list_administrative_actions. All schema references are included. Supply parameters under path and query and JSON under body. Never guess an organization, project, connection, or agent ID.
export_email_configreadExport an inbox
forward_emailwriteForward an existing message (by its opaque id) to new recipients and submit it for HUMAN REVIEW: the default
get_attachmentreadDownload one attachment
get_backlog_statusreadRead the category
get_categoryreadFetch one category by id (cat_...): its name, description, scope, and graduation state.
get_deliverability_statusreadRead this org
get_domainreadAnswer whether a domain is ready, whether the customer or Extrovert needs to act, and what to do next.
get_inboxreadFetch one inbox by id or address (includes its metadata).
get_messagereadFetch one message by its opaque id (msg_...), as returned by read_messages / search / wait_for_email. The owning
get_pacing_statereadRead the category
get_reviewreadFetch one review request by id (rr_...): its current state,
get_review_turnsreadFetch the append-only thread turns for a review (rr_...): the intent, every draft revision, human comments/edits/
get_risk_dialwriteRead the brand-risk dial that governs auto-send: the account-wide default plus every category
get_rule_auditreadRead the append-only change/undo audit log spanning rules AND categories (D11): the safety net for the shared/house-
get_rulesreadGet the ORDERED active writing rules for a compose/redraft. The section 7 precedence ladder is applied SERVER-SIDE
get_submissionreadCheck an accepted email
get_threadreadRead a full conversation, all messages oldest-first. If you already have a message, pass its exact message_id;
get_webhookreadFetch one registered webhook by id (whk_...). The signing secret is redacted.
list_attachmentsreadList the attachments on a message: their opaque id, filename, content type, and size. Use the returned id with
list_categoriesreadBrowse the categories in this account (id + name + description + scope + state) so you can MATCH an existing
list_commerce_requestsreadList visible domain-purchase and plan-change requests. Use returned ids with get_commerce_request for complete
list_contact_listsreadList the allow/block contact-list entries that govern an inbox: its inbox-specific entries plus any
list_deliverability_findingsreadList this org
list_domain_eventsreadRead durable updates for a visible domain, including ready, action needed and recovered.
list_domainsreadList visible domains with a plain-language readiness result, who needs to act, and the next step.
list_inboxesreadList inboxes visible to this connection, newest first. Follow next_cursor with the same filters for more pages.
list_outboxreadList bounded outbound work accepted for an inbox.
list_review_eventsreadNon-blocking drain of the next un-acked review nudges for this agent, in FIFO order (strict per review), with
list_reviewsreadList the review requests submitted in this account so a sending agent can monitor its submissions in the human
list_suppressionsreadList this org
list_threadsreadList conversation threads in an inbox, most-recently-active first. Pass next_cursor back as cursor to continue without restarting the list.
list_webhooksreadList a bounded page of inbound webhooks within this connection
mark_readdestructiveSet or clear a message
offboard_domaindestructiveRemove a domain from the customer. DESTRUCTIVE AND IRREVERSIBLE: the teardown job
onboard_domainwriteAdd an inbox subdomain the customer controls. The customer publishes the returned nameserver records;
post_review_chatwriteAsk the human reviewer a clarifying question on a review
promote_rulewriteMove a rule between the category and general/house-style layers (via a supersession). Promote to
propose_categoryreadPropose a NEW category with a name + a skill-style description (D9). It stands immediately and is shared across
propose_graduationreadPROPOSE graduating a category (D16/D6): records your request (with optional evidence) for a human to review and
quote_domainreadCheck current availability and first-year/renewal pricing for a domain. This never purchases, reserves, or
read_messagesreadList messages in an inbox, newest first. Narrow with exact-field filters (from/to/subject substring) or
redeem_enrollmentreadExchange a single-use enrollment token (pk_enroll_...) for a SCOPED agent key (pk_agent_...) bound to this agent.
register_webhookreadRegister an HTTPS endpoint to receive HMAC-signed inbound-message deliveries. Each delivery carries
reply_emailwriteCompose a reply within an existing thread and submit it for HUMAN REVIEW: the default path, exactly like
request_domain_purchasewriteCreate a durable domain-purchase request. This tool does NOT approve the request and does NOT assert that a
request_plan_changewriteCreate a durable upgrade or downgrade request for human review. This tool never approves its own request.
retire_ruledestructiveSoft-delete a rule (status=
reviewer_decidewriteREVIEWER PLANE (review:act): submit your decision on a review (rr_...) you
revoke_suppressiondestructiveRevoke ONE of this org
save_rulewriteMaintain a project-level writing rule outside authenticated reviewer feedback. The audit log and undo preserve history. scope=
searchreadFull-text search across messages (subject, body, sender). Scope to one inbox with
search_threadsreadSearch conversation threads by subject, participant, or latest-message snippet. Results are newest-active first; pass next_cursor back as cursor to continue.
send_emailwriteCompose a new email from one of this agent
sign_upreadReserve a free inbox for your agent. Supply the human email expected to activate it.
stream_inforeadDescribe the Server-Sent-Events (SSE) journal for message.* and review.* events. This tool returns URLs, not an open stream.
submit_revisionwritePost a NEW draft for a review (rr_...) under a parent_revision CAS: the way to redraft after feedback, a chat
undo_rule_changereadUndo a rule change by its audit-row id (udo_...): restore the prior version as a NEW forward supersession (action=
update_categorywriteUpdate a category
update_inboxwriteUpdate an inbox
update_webhookwriteUpdate a registered webhook in place by id (whk_...). Change the delivery
verify_domainwriteTrigger/refresh verification for an onboarded domain and return its (possibly advanced) status.
verify_signupreadComplete activation after check_activation reports proven, or supply a legacy emailed OTP. On success the bootstrap key is revoked and you receive a NEW
wait_for_domainreadWait up to 50 seconds for mail readiness without triggering DNS work. Return immediately if the domain is ready, the customer must act, or setup needs attention.
wait_for_emailreadBlock until the next matching message arrives in an inbox, then return it with any OTP code / verification link
wait_for_review_eventreadLong-poll (~25-55s) for the next review nudge: blocks until one is available OR the deadline, then returns like
whoamireadConfirm that this agent is connected, show the organization and project it acts in, and explain which actions
04

Trust audit

CAUTIONgrade B · trust 88/100 Install with care. The audit found things worth knowing before you trust its output.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (2 observation(s))
Network
declared (12 observation(s))
Shell
declared (2 observation(s))
Dependencies
pinned
Secrets in source
none-found

Findings (9)

MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
packages/mcp/src/tools.ts:1358
"review, and a worse one, because it exfiltrates a conversation. Under the default `require_review` policy a " +
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
packages/mcp/scripts/fresh-session-smoke.mjs:15
const url = new URL(request.url ?? "/", "http://127.0.0.1");
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
packages/mcp/scripts/fresh-session-smoke.mjs:46
childEnv.EXTROVERT_API_BASE_URL = `http://127.0.0.1:${address.port}`;
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
packages/mcp/src/oauth-login.ts:192
try { url = new URL(req.url ?? "/", "http://127.0.0.1"); }
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
packages/mcp/src/oauth-login.ts:211
const redirectUri = `http://127.0.0.1:${(server.address() as AddressInfo).port}/callback`;
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
delete_contact_list_entry, delete_inbox, delete_message, delete_thread, delete_webhook, mark_read, offboard_domain, retire_rule, revoke_suppression
Why it matters. 9 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
packages/sdk/src/fixtures.ts:146
const json = typeof atob === "function" ? atob(b64) : Buffer.from(b64, "base64").toString("utf8");
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
README.md:88
Submit limited evidence with `feedback.submit`, open a tracked conversation with `support.cases.create`, and follow published replies with `support.cases.get` / `.events`. MCP users can use `submit_fe
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
packages/mcp/README.md:130
use other agents' inboxes, change access and policies, create credentials, and
Why it matters. asks the agent to read credentials

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 6b6f585b9ba0full audit observations/trust-audit/mcp-server/extrovert-dot-dev__extrovert-js.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-116b6f585b9ba0CAUTIONB88first audit
06

Questions

What is the @extrovert.dev/sdk MCP server?

TypeScript SDK and MCP server for Extrovert

What tools does @extrovert.dev/sdk expose?

79 in total: 51 read-only, 19 that write, and 9 that can delete or overwrite (delete_contact_list_entry, delete_inbox, delete_message, delete_thread, delete_webhook). Every one is listed on this page with its risk.

Is @extrovert.dev/sdk safe to connect to an agent?

With care. The audit graded it B (88/100) and found 9 things worth knowing before you trust this server, listed below with the exact line each was found on. Separately from the audit: 9 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does @extrovert.dev/sdk need?

It reads ACTIONS_ID_TOKEN_REQUEST_TOKEN, ACTIONS_ID_TOKEN_REQUEST_URL, EXTROVERT_API_KEY and EXTROVERT_WEBHOOK_SECRET from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does @extrovert.dev/sdk run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as @extrovert.dev/sdk at 0.1.8.

How current is this page?

The grade is for one exact copy of the source (6b6f585b9ba0), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement