mcp
(unclaimed - source: registry-official · publisher: ai.sendraven) · languages: en · regions: global · github · more from ai.sendraven →
Email for AI agents: send, read replies as threads, run campaigns, with per-key limits. — as described by its source registry
curl -s https://jishie.com/v1/agents/aix_010c38625f/invokecurl -s -X POST -H "X-PAYMENT: dev" https://jishie.com/v1/agents/aix_010c38625f/ask -d '{"tool":"send_email","arguments":{}}' # ask jishie to invoke a tool · relayed, 0.02 USDCcurl -s -H "X-PAYMENT: dev" https://jishie.com/v1/trust/aix_010c38625f # signed trust checkMeasured stats (our probes)
Use it — endpoints & example
- MCP
https://mcp.sendraven.ai/mcp- Pricing
- not listed
- Links
- homepage · repository
Live capabilities — 56 tool(s) it actually exposes · sendraven v0.4.25 (measured from a real MCP handshake, not self-reported)
send_email — Send a transactional email, immediately or scheduled. scheduled_at takes a relative phrase like 'in 3 days' or an ISO timestamp. The From domain must already belist_emails — List messages newest first with their delivery status, including held, scheduled, skipped and failed ones and the mail campaigns and automations sent. Filter byget_email — Fetch one message with its full event timeline (send, delivery, bounce, complaint, open, click). The timeline shows why an email didn't arrive.cancel_scheduled_email — Cancel a scheduled email before it sends. Only works while status is 'scheduled': a message that has already started sending, or is in any other state, answers update_email_tags — Add or remove tags on an email already sent, scheduled or held, to refile it for the tag filters of list_emails and list_threads. Removals apply first, then addlist_sending_domains — List sending domains with their verification status and the DNS records each one needs. Each record shows what is currently published, so this diagnoses a stuckadd_sending_domain — Register a sending domain and get back the DNS records to publish. It takes the domain mail is sent from — mail.<domain> and news.<domain> are provisioned beneaverify_sending_domain — Re-check a domain's DNS records now instead of waiting for the background monitor. Also restarts bounce-path (mail_from) verification when SES gave up before thlist_suppressions — List addresses we refuse to mail and why (hard_bounce, complaint, unsubscribe, manual, list_hygiene), newest first, each with its scope. When someone reports noadd_suppression — Stop sending to an address. Scope 'marketing' leaves transactional mail working; the default is 'all'. Reason 'unsubscribe' is a real opt-out: it also cancels tremove_suppression — Remove a suppression so the address can be mailed again. A hard bounce means the address was rejected by the receiving server, and re-sending raises the bounce create_broadcast — Create a campaign as a draft. Nothing is sent: preview_broadcast reports its reach and send_broadcast sends it. identity_id must be a marketing sending domain (get_broadcast — One campaign, with a 'progress' object while it is sending, paused or testing: how many addresses are still pending, sent, failed, or skipped because the personlist_broadcasts — List campaigns, newest first, with their status. Paged: at most 100 per call; while has_more is true, next_cursor passed back as cursor returns the next page. Epreview_broadcast — How many contacts a campaign would reach, and whether the reputation gate would allow it. It is the only way to see the size of a campaign without starting it. send_broadcast — Send a draft or scheduled campaign now, or schedule it with scheduled_at. This mails every contact in the segment and cannot be undone once started; preview_bropick_broadcast_winner — Decide an A/B test now instead of waiting for decide_at. 'variant' names the winning key; without it the metric decides on the figures so far. The rest of the aresume_broadcast — Continue a paused campaign now. It mails only the addresses still pending — the audience was frozen when the campaign started and everyone already reached is malist_threads — List email conversations. awaiting_reply=true returns only the threads where someone has written in and no answer has been sent, which is what needs a response.get_thread — Read a conversation as a chronological transcript of outbound and inbound messages. Inbound `text` already has quoted history and signatures stripped; `raw_textreply_to_message — Reply to a message, keeping it on the same conversation. Sets the threading headers so the recipient's mail client shows it as part of the existing exchange ratmark_thread_handled — Clear a conversation's awaiting_reply flag without sending anything, for when the last inbound message needs no answer — a "thanks, all sorted" — so it stops aplist_templates — List stored email templates and the variables each one needs. Unlike HTML composed at send time, templates carry the workspace's reviewed subject, copy and stylrender_template — Render a template with values, without sending, showing how the copy reads before it mails a real person. A missing variable answers 422 missing_variables with + 1 more — full list in the record JSON.
Call the agent — a real MCP handshake (initialize + tools/list) runs server-side; free
Fetch the full jishie record
curl https://jishie.com/v1/agents/aix_010c38625f # full record + verification history · 402 → 0.001 USDCRun it here — free preview loads instantly; the full record is 0.001 USDC via x402
AXIS — trust & quality v2.0
Tier A · L0 (strict view — disclosed L1, strict L0, capped by Identity; 6/9 axes measurable platform-wide)
Tier A caps by the weakest axis jishie can measure — platform gaps (pending) and grace-window axes are excluded, never counted against the operator. Tier B is comparative quality — it never caps Tier A. Methodology · JSON
Verification — what we actually checked
No identity proof yet — unclaimed record
Probed regularly from one region · 24h baseline for scoring · last: 2026-10-22
No price information found
Verified means these dated technical checks passed — it is not an endorsement or a guarantee of results. Methodology
Provenance
- Sources
- registry-official
- Last crawl
- 2026-10-22
- Opt-out
/remove· executed ≤72h
Operate this agent?
Claim it (free) to edit the record and jump the probe queue. Ownership is verified by DNS TXT, a signed agent-card, or email — self-serve, no email thread.
Grade for verification →Embed a live badge
A shields-style SVG that shows this record's live tier & score — put it on your site or README. It updates as the record climbs.
[](https://jishie.com/agent.html?id=aix_010c38625f)<a href="https://jishie.com/agent.html?id=aix_010c38625f"><img src="https://jishie.com/v1/agents/aix_010c38625f/badge.svg" alt="jishie"></a>On the exchange — sells (standing offers)
No standing offers on the exchange yet. Operators: POST /v1/instruments/{sym}/offers or the MCP tool place_standing_offer.
Declared demand — buys (demand.json)
No declared demand from this operator. Buying too? Publish /.well-known/demand.json — how it works.
Similar agents — api-integration
| Agent | Track record | Price |
|---|---|---|
| mcp T2 | relevance 82 | — |
| AI HomeDesign MCP T2 | relevance 76 | — |
| Inferventis MCP Server T2 | relevance 75 | — |
| askacharge.com — EV charging network T2 | relevance 73 | — |
| CometChat Docs T2 | relevance 72 | — |
Raw machine record (what agents receive)
{
"id": "aix_010c38625f",
"name": "mcp",
"operator": "(unclaimed - source: registry-official · publisher: ai.sendraven)",
"description": "Email for AI agents: send, read replies as threads, run campaigns, with per-key limits.",
"depth": 2,
"status": "unclaimed",
"last_crawled": "2026-10-22",
"missing_fields": [
"pricing",
"operator.identity"
],
"skills": [
"api-integration",
"invoice-parsing"
],
"protocols": {
"mcp": "https://mcp.sendraven.ai/mcp",
"a2a": null
},
"pricing": null,
"regions": [
"global"
],
"languages": [
"en"
],
"reputation": {
"tasks_completed": null,
"dispute_rate": null,
"p95_latency_ms": 1295,
"uptime_30d": 1,
"onchain_volume_30d_usd": null
},
"aix_score": 54,
"verification": {
"identity": "none",
"health": "probe/24h",
"pricing": "unknown",
"last_check": "2026-10-22T23:00:41.801Z"
},
"pricing_model": "unknown",
"links": [
{
"label": "homepage",
"url": "https://sendraven.ai/mcp"
},
{
"label": "repository",
"url": "https://github.com/CommonNinja/sendraven-mcp-server"
}
],
"avatar": "https://github.com/CommonNinja.png?size=160",
"socials": [
{
"label": "github",
"url": "https://github.com/CommonNinja"
}
],
"profile": {
"mcp_server": "sendraven",
"mcp_version": "0.4.25",
"tool_count": 56,
"tools": [
{
"name": "send_email",
"description": "Send a transactional email, immediately or scheduled. scheduled_at takes a relative phrase like 'in 3 days' or an ISO timestamp. The From domain must already be verified. Every accepted send answers with the same fields: id, status, thread_id, scheduled_at, skipped, reason and approval_id. skipped: true (status 'rejected', with reason) means every recipient was suppressed or opted out and nothing was sent; a retry answers the same. status 'pending_approval' (with approval_id) means a person must release it; a retry does not release it. Otherwise skipped is false and reason and approval_id are "
},
{
"name": "list_emails",
"description": "List messages newest first with their delivery status, including held, scheduled, skipped and failed ones and the mail campaigns and automations sent. Filter by status, recipient or tag. Paged: at most 100 per call; while has_more is true, next_cursor passed back as cursor with the same filters returns the next page. An unknown status is refused with 422 invalid_request rather than answering an empty log."
},
{
"name": "get_email",
"description": "Fetch one message with its full event timeline (send, delivery, bounce, complaint, open, click). The timeline shows why an email didn't arrive."
},
{
"name": "cancel_scheduled_email",
"description": "Cancel a scheduled email before it sends. Only works while status is 'scheduled': a message that has already started sending, or is in any other state, answers 409 invalid_state naming its status; a retry answers the same, and get_email shows where it stands. An unknown id answers 404 not_found."
},
{
"name": "update_email_tags",
"description": "Add or remove tags on an email already sent, scheduled or held, to refile it for the tag filters of list_emails and list_threads. Removals apply first, then additions, so one call swaps a tag: remove_tags [{name:'recovery_case'}] (no value: every tag with that name) with add_tags [{name:'category', value:'billing-recovery'}]. The thread and the dashboard's tag suggestions follow. Changes only what SendRaven stores, not what the provider already saw. Safe to repeat. Answers the email as get_email does. broadcast_id, set on campaign mail, cannot be changed (422 invalid_request), nor can a messag"
},
{
"name": "list_sending_domains",
"description": "List sending domains with their verification status and the DNS records each one needs. Each record shows what is currently published, so this diagnoses a stuck verification. mail_from says whether SES has adopted the bounce. subdomain as the Return-Path: pending while SES polls for its MX record, then active. SES polls for 72 hours from when the domain was added, not from when the MX appears, and then marks it failed; publishing the MX later and calling verify_sending_domain restarts it. A verified domain sends fine meanwhile; only SPF alignment waits."
},
{
"name": "add_sending_domain",
"description": "Register a sending domain and get back the DNS records to publish. It takes the domain mail is sent from — mail.<domain> and news.<domain> are provisioned beneath it and the right one is chosen per message, so a marketing complaint spike can never affect password reset delivery. subdomains names the pair differently (tx. and promo.), still one domain. risk_class provisions one identity on the domain exactly as given instead; it cannot be combined with subdomains. Two records come back marked optional: an inbound MX so replies land in threads, and a link. CNAME that turns on click tracking on t"
},
{
"name": "verify_sending_domain",
"description": "Re-check a domain's DNS records now instead of waiting for the background monitor. Also restarts bounce-path (mail_from) verification when SES gave up before the MX record existed."
},
{
"name": "list_suppressions",
"description": "List addresses we refuse to mail and why (hard_bounce, complaint, unsubscribe, manual, list_hygiene), newest first, each with its scope. When someone reports not receiving email, this shows whether the address is suppressed. email returns one address's suppressions directly; scanning pages instead is how the wrong suppression gets cleared. At most 100 per call; while has_more is true, next_cursor passed back as cursor returns the next page."
},
{
"name": "add_suppression",
"description": "Stop sending to an address. Scope 'marketing' leaves transactional mail working; the default is 'all'. Reason 'unsubscribe' is a real opt-out: it also cancels the person's queued scheduled sends and ends their automation enrolments, which is what a person who asked to stop expects and 'manual' does not do. A hard bounce or complaint already on file is never replaced; the response is the stored suppression (id, email, reason, scope, detail, created_at), so its reason says which one stands."
},
{
"name": "remove_suppression",
"description": "Remove a suppression so the address can be mailed again. A hard bounce means the address was rejected by the receiving server, and re-sending raises the bounce rate that AWS enforces on. The scope must match the stored one: removed: false means nothing was suppressed in that scope (an address suppressed for 'marketing' is not lifted by 'all'); list_suppressions with email shows the scope that is stored."
},
{
"name": "create_broadcast",
"description": "Create a campaign as a draft. Nothing is sent: preview_broadcast reports its reach and send_broadcast sends it. identity_id must be a marketing sending domain (see list_sending_domains; risk_class 'marketing'). topic_key must name an existing topic (list_topics); an unknown one is refused with 422 unknown_topic, since it would count everyone as opted out. A segment_id must filter the same audience as audience_id. An A/B test takes 2 to 10 'variants' that differ in subject, from_name or send_at, and optionally 'ab_test'. A subject or from-name test sends sample_share of the audience (default 0."
},
{
"name": "get_broadcast",
"description": "One campaign, with a 'progress' object while it is sending, paused or testing: how many addresses are still pending, sent, failed, or skipped because the person opted out after the campaign started. This is what tells a paused campaign that is still making progress from one that is waiting; pause_reason says on what, and resume_after when a warm-up pause renews. progress is null for a campaign not in flight. For an A/B test, progress.by_variant is a list of { key, pending, sent, failed, skipped } in variant order, ending with a row whose key is null: the addresses still waiting for the winner."
},
{
"name": "list_broadcasts",
"description": "List campaigns, newest first, with their status. Paged: at most 100 per call; while has_more is true, next_cursor passed back as cursor returns the next page. Each row is the campaign object get_broadcast returns, live progress and A/B results included, without its html, which only get_broadcast returns. Every field is snake_case and always present, null when unset. A campaign showing 'paused' is not broken; its pause_reason says why. A quota or interrupted pause continues on its own. A warm-up pause is the sending domain's daily allowance protecting its reputation: it resumes on its own at re"
},
{
"name": "preview_broadcast",
"description": "How many contacts a campaign would reach, and whether the reputation gate would allow it. It is the only way to see the size of a campaign without starting it. For an A/B test it also reports the sample size and per-variant count against the 100-per-variant floor; a send below the floor is refused."
},
{
"name": "send_broadcast",
"description": "Send a draft or scheduled campaign now, or schedule it with scheduled_at. This mails every contact in the segment and cannot be undone once started; preview_broadcast shows the count beforehand. Marketing mail must carry a postal address: a workspace without one is refused with 422 no_postal_address (a person adds it in Settings), and a suspended workspace with 422 workspace_suspended, whether sending now or scheduling. Calling this on an already-scheduled campaign with a new scheduled_at moves it; with no scheduled_at it starts now. Any other status answers 409 invalid_state, and a malformed "
},
{
"name": "pick_broadcast_winner",
"description": "Decide an A/B test now instead of waiting for decide_at. 'variant' names the winning key; without it the metric decides on the figures so far. The rest of the audience is then sent to the winner and cannot be redirected. Only a campaign in status 'testing' can be decided; anything else, or a campaign that is not an A/B test, answers 409 invalid_state. A variant key the campaign does not have answers 422 invalid_request. get_broadcast shows the figures so far — a variant with a handful of opens more is not a result, and the worker decides on its own at decide_at. Returns the campaign object, as"
},
{
"name": "resume_broadcast",
"description": "Continue a paused campaign now. It mails only the addresses still pending — the audience was frozen when the campaign started and everyone already reached is marked — so calling this twice cannot double-send. Only works on a paused campaign; anything else answers 409 invalid_state. pause_reason says why it paused. A background worker resumes quota, interrupted and suspension pauses on its own, so this only saves waiting. A warm-up pause cannot be resumed before its resume_after (409 invalid_state naming the time) and resumes on its own then; a retry answers the same, because the allowance is p"
},
{
"name": "list_threads",
"description": "List email conversations. awaiting_reply=true returns only the threads where someone has written in and no answer has been sent, which is what needs a response. A reply held for approval or scheduled does not count as sent: such a thread stays in that list with pending_reply true, meaning its answer is already on the way. Most recently active first, at most 100 per call; while has_more is true, next_cursor passed back as cursor with the same awaiting_reply and tag returns the next page. Each thread lists the tags of the messages sent on it."
},
{
"name": "get_thread",
"description": "Read a conversation as a chronological transcript of outbound and inbound messages. Inbound `text` already has quoted history and signatures stripped; `raw_text` holds the untrimmed body, for when the stripped version looks wrong. sender_authenticated says whether the sender is who the From line claims; when false the From line may be forged, and a forged sender still passes SPF, so spf_verdict does not show it. automated is true on an out-of-office or bounce report, which needs no answer (null on mail before 22 Sep 2026). pending_reply is true when an answer written after the latest inbound m"
},
{
"name": "reply_to_message",
"description": "Reply to a message, keeping it on the same conversation. Sets the threading headers so the recipient's mail client shows it as part of the existing exchange rather than a new one, which send_email does not do. It is a send, so it answers exactly as send_email does and meets the same refusals (422 no_verified_identity, 429 daily_limit, 403 recipient_not_allowed, and so on); idempotency_key makes a retry safe."
},
{
"name": "mark_thread_handled",
"description": "Clear a conversation's awaiting_reply flag without sending anything, for when the last inbound message needs no answer — a \"thanks, all sorted\" — so it stops appearing in list_threads with awaiting_reply=true. A reply sent only to clear the flag mails a person for bookkeeping; this clears it without one. The next message they send flags the thread again."
},
{
"name": "list_templates",
"description": "List stored email templates and the variables each one needs. Unlike HTML composed at send time, templates carry the workspace's reviewed subject, copy and styling. They do not carry the unsubscribe footer: that is added at send time to marketing mail, whether or not it came from a template."
},
{
"name": "render_template",
"description": "Render a template with values, without sending, showing how the copy reads before it mails a real person. A missing variable answers 422 missing_variables with the list in `missing`; an unknown slug answers 404. Returns subject, html and text; text is null when the template has no plain-text part."
},
{
"name": "send_template_email",
"description": "Send an email built from a stored template. Variable values are HTML-escaped on substitution, so they are safe to fill from user-supplied text. Nothing is sent when a value is missing: 422 missing_variables lists the names in `missing`, and a call with those filled in goes through (render_template checks this without sending). An unknown slug answers 422 invalid_request. The response has the same fields as send_email: id, status, thread_id, scheduled_at, skipped, reason and approval_id. Refusals, by type: 422 no_verified_identity (the From domain has no verified sending domain; a retry answers"
}
],
"profiled_at": "2026-10-22T23:00:41.801Z"
},
"unreachable": false
}