Qorami

io.github.loicfontaine-maxPublished by GitHub account loicfontaine-maxv1.0.0Updated Oct 24, 2026

Check an email before an AI agent sends it: send / ask a human / block. Detects prompt injection.

Overview

AI-generated overview

Qorami is a local MCP server that lets an AI assistant check an outgoing email with Qorami and get a send, human-review or block decision before it is sent.

What you can do
Check service health and connectivity for the Qorami guard endpoint via qorami_health and verify_email, which submits a recipient, subject and body for a send / request_human_confirmation / do_not_send decision, and check_action_status, which polls a pending action until a human review resolves it. Receive a cleaned, redacted copy of a risky email when the risk comes only from removable content such as a leaked secret, suspicious link or card number, plus a list of what was stripped.
When to use it
Use it when an agent composes or sends email and you want a control point that can block risky messages or route them to a human for approval before delivery. Useful for sales or general outbound email policies where prompt injection and leaked secrets are a concern.
Requirements
Runs as a local stdio process, installed from the npm package qorami-mcp, for desktop MCP clients such as Claude Desktop or Cursor. Requires a Qorami workspace API key supplied in the QORAMI_API_KEY environment variable, obtained from the Qorami dashboard. Network access to the Qorami service is needed.
Before you install
The server sends email content (recipient, subject and body) to the third-party Qorami service for evaluation, so avoid submitting sensitive material you do not want processed there. It requires the secret QORAMI_API_KEY. It only returns a decision; actually sending, queueing or blocking the email is left to your own code, so the guard is only effective if the agent obeys the returned decision.

Installation

In SourceWeft

  1. Open Qorami in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

Qorami SDK

Official clients, tool schemas and an MCP server for Qorami — a control point between your AI agents and actually sending email. Before each send, the agent asks Qorami, which replies send, request_human_confirmation, or do_not_send.

Get an API key in the dashboard. Full API reference: https://qorami.fr/docs.

PathWhat
js/Zero-dependency JavaScript / TypeScript client (fetch, Node 18+ or browser).
python/Zero-dependency Python client (stdlib only) + LangChain, CrewAI, LlamaIndex & OpenAI-Agents tools.
tools/Drop-in OpenAI function-calling & Anthropic tool-use schemas for qorami_check_email.
mcp/Stdio MCP server (qorami_health, verify_email, check_action_status) for Claude Desktop, Cursor, any MCP client.
n8n-nodes-qorami/n8n community node (Settings → Community Nodes → n8n-nodes-qorami) — guard an email, usable as an AI-Agent tool.
n8n/No-code recipe: guard a workflow's email with a plain HTTP Request node (no install).
examples/Runnable Node & Python quickstarts.

JavaScript / TypeScript

js
import { QoramiClient } from './js/qorami.mjs'
const qorami = new QoramiClient({ apiKey: process.env.QORAMI_API_KEY })
await qorami.guard(  { recipient: '[email protected]', subject: 'Our offer', body, policyProfile: 'sales' },  {    send: () => mailer.send(),                            // allowed    requestHumanConfirmation: (r) => queue(r.action.id), // a human was notified    doNotSend: (r) => log('blocked', r.decision),        // do not send  },)

Or step by step with qorami.verify(...) and, after a review, poll qorami.status(actionId) until nextAction.type === 'send'.

Python

python
from qorami import QoramiClientqorami = QoramiClient(api_key=os.environ["QORAMI_API_KEY"])
result = qorami.verify(recipient="[email protected]", subject="Our offer",                       body=email_body, policy_profile="sales")if result.next_action_type == "send":    send_email()elif result.next_action_type == "request_human_confirmation":    queue_for_review(result.action_id)   # a human was notified by email# else: do_not_send

Agent framework tools

pip install qorami[<framework>] ships a drop-in qorami_check_email wrapper — each returns ALLOWED / NEEDS HUMAN APPROVAL / BLOCKED and reuses the client:

FrameworkInstallImport
LangChainpip install qorami[langchain]from qorami_langchain import build_qorami_tool
CrewAIpip install qorami[crewai]from qorami_crewai import QoramiEmailGuard
LlamaIndexpip install qorami[llamaindex]from qorami_llamaindex import build_qorami_tool
OpenAI Agents SDKpip install qorami[openai-agents]from qorami_openai_agents import qorami_check_email
python
from qorami_langchain import build_qorami_tooltool = build_qorami_tool()        # reads QORAMI_API_KEY

No-code workflows (n8n) use a plain HTTP Request node — see n8n/.

MCP server

Register Qorami as a native tool in Claude Desktop / Cursor / any MCP client — see mcp/. It exposes qorami_health, verify_email and check_action_status over stdio.

The contract

Every client returns the same decision the agent must obey via nextAction.type: send, request_human_confirmation (a human approves first — poll the action), or do_not_send. See https://qorami.fr/docs.

Cleaned version (auto-remediation)

When an email is risky only because of mechanically-removable content (a leaked secret, a suspicious link, an IBAN/card/SSN), the verify result carries a cleaned, sendable copy — send remediation.safeBody instead of blocking outright:

js
const r = await qorami.verify({ recipient, subject, body, policyProfile: 'general' })if (r.nextAction.type === 'do_not_send' && r.remediation?.safeToSend) {  mailer.send({ ...email, body: r.remediation.safeBody })   // safe, redacted copy}
python
r = qorami.verify(recipient=..., subject=..., body=email_body)if r.next_action_type == "do_not_send" and (r.remediation or {}).get("safeToSend"):    send_email(body=r.remediation["safeBody"])   # safe, redacted copy

remediation.removed lists what was stripped (e.g. ["secret", "link"]). The MCP server surfaces the same field.

License

MIT — see LICENSE.

Source: README.md at commit 8cb2547

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v1.0.0LatestSep 16, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts