Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

DSAIL

PYPI · DSAIL · 2 COMPONENTS

Turn a written policy into rules a program can check, and get the same answer every time.

0 this week 82 Trust /100

Last scanned (18 hours ago)

Scores higher than 84% of PyPI servers

Category Developer Tools

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security100
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • Runs setuptools.build_meta at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
  • 1 of 28 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency48
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
  • Clear OSI-approved license (Apache-2.0).Pass
  • Actively maintained (last published 27 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability60
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 9923 tokens (~496/item across 20 items; 20 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
  • No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
  • Structured output schemas are declared (95% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 21 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
What we tested

Checks we ran (16)

  • Malware scan
  • Known CVEs
  • Install scripts
  • Dependency health
  • Source repository
  • Provenance
  • License
  • Maintenance
  • Security disclosure
  • Schema quality
  • Stability
  • Tool coverage
  • Injection markers
  • Destructive annotations
  • Judged manipulation
  • MCP protocol

Does not apply to this package (2)

  • Endpoint SecurityScored on hosted endpoints only. A package has no live endpoint of its own for us to probe.
  • Transport & ReachabilityScored on hosted endpoints only. A package has no live endpoint of its own for us to probe.

The score does not measure everything. What the score does not measure →

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 27 Oct 26 +15
    • Malware scan: unverified → pass ▲ security
  • 26 Oct 26 −15
    • Malware scan: pass → unverified ▼ security
  • 20 Oct 26 0
    • Stability: 0.97 → pass security
  • 19 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.

  • 16 Oct 26 +41
    • Injection markers: unverified → pass ▲ security
    • Stability: unverified → 0.87 ▲ functional
    • MCP protocol: unverified → pass ▲ functional
    • Tool coverage: unverified → 100 ▲ functional
    • Package version: 1.0.3 → 1.0.6 functional
  • 15 Oct 26 0
    • Package version: 1.0.3 → 1.0.6 functional
  • 14 Oct 26 0
    • Package version: 1.0.3 → 1.0.6 functional
  • 13 Oct 26 0
    • Package version: 1.0.3 → 1.0.6 functional
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 5 Nov 2026 · Analysed pypi/dsail@1.0.6

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem pypi
Reason No attestation published

Background: How many MCP packages publish verified provenance →

Install scripts 1 script
Hook Tier Command
build_backend Known build tool setuptools.build_meta

Background: Why install scripts are a supply-chain risk →

Dependencies 28 packages
Packages resolved 28
No linked repository 1
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 20 exposed · ~6,327 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
dsail_add_unit_converter ~304

Give a policy check the conversion it needs between two units, with a factor a person supplied. Use when a rule and its claim values use different units and a person has supplied the conversion factor needed to compare them. Adds a unit converter to this project so rules mixing the two units resolve instead of answering UNKNOWN. to = from * factor + offset. The factor is a policy decision with legal weight — an exchange rate fixed by a contract, a density fixed by a spec — and `attribution` records the person or document it came from, because a figure recalled from training would enter results as though a person had decided it. This changes results. A check is reproducible from the PAIR (ruleset_hash, unit_library_hash); this edit changes the second half, so an approval recorded against the previous library no longer describes what the ruleset does. The result says so.

NameTypeReqDescription
attribution––Who supplied the factor, or the document it comes from. Recorded beside the converter, outside the hashed library.
factornumberyesThe multiplier a person supplied: one `from_unit` equals `factor` `to_unit`. Never a value recalled from training — a rate is a policy decision.
from_unitstringyesThe unit converted from (`EUR`).
offsetnumber–Added after multiplying, for affine conversions such as temperatures. Default 0.
to_unitstringyesThe unit converted to (`USD`).

Structured output declared, but exposes no named fields.

No examples provided.

dsail_check ~577

Check extracted values against a written policy and get the same answer every time, with the rule that decided. Use when reviewers disagree about applying decided rules to the same facts, or repeated reviews give inconsistent answers. Takes the ruleset and claim values extracted by the caller's own model. Validates a claim dictionary and solves it against a ruleset, in one call. Takes `ruleset_hash` (a compiled ruleset's content hash) or `source`. `claims` maps every declared claim name to a value; a claim that could not be determined is the string "unknown", which the rules treat as a first-class answer rather than a guess. Returns every rule with the assertions it states, each carrying the engine's own result — TRUE (it holds), FALSE (it is violated), UNKNOWN (a claim it needs was not determined) or AMBIGUOUS (its evidence was contradicted), with the assertion's name and source text, and which claims had no value. AMBIGUOUS is reserved: it needs several answers for one claim, and a claim dictionary holds one, so no check sent here returns it. A rejected dictionary names every failing field at once as {field, expected, received}. There is no overall verdict, by design: the four per-assertion words are the whole answer, and what a FALSE costs is a decision for whoever reads it. This is the one metered call. It counts against the account's allowance of Jaxon Verified Units: one rule checked against up to 1,000 characters is one JVU, so a call carrying more rules or more text counts as more than one. When the allowance is used it answers ENTITLEMENT_EXCEEDED, and everything except checking keeps working.

NameTypeReqDescription
claimsobjectyesThe claim dictionary to evaluate: one entry per declared claim, keyed by claim name, values as the prompt pack specifies (`"120 USD"`, `true`, `"unknown"` for a value the extractor could not determin…
label––Optional application-domain label: `{"topic": "<a few words on what the policy governs>"}`, or `{"declined": true}`. Matched against the published vocabulary and then discarded; never stored on the r…
ruleset_hash––The content hash of an already compiled ruleset (from `dsail_compile` or a saved name). Give this OR `source`, not both.
source––DSAIL source text, byte for byte as compiled. Give this OR `ruleset_hash`; prefer the hash for anything already compiled.

Structured output declared, but exposes no named fields.

No examples provided.

dsail_compile ~1,778

Turn a written policy into rules a program can check. Use when two reviewers apply the same written criteria differently, or a handbook's decided rules need repeatable application. The person has already decided the policy; DSAIL formalises decisions, it does not draft policy, resolve conflicting policies or interpret an ambiguous regulation. Compiles DSAIL ruleset source. Returns the content hash that addresses this exact ruleset, the claim manifest (every claim with its question, type and vocabulary), the claim JSON schema, and the validation contract a check will enforce — so what will be rejected is known before anything is submitted. Also returns `review`: a plain-text rendering of every question this ruleset asks and every decision it makes. It is what a person signs when they approve the hash, so it is worth showing them before an approval is recorded. Renders nothing on its own, so iterating on it costs nothing. On failure the result carries diagnostics naming the offending line, plus the grammar below as `hint`. On success the hash is what the review widget, a check and an approval all address. `parent_hash` (optional) links this revision to the one it edits, so the review can show a diff; source relayed from the widget's own edit control arrives with the parent it names. `label` (optional, inert): {domain: <level-one id>, topic: <short phrase>, confidence: high|medium|low}, the caller's reading of what domain the policy belongs to, stored as vocabulary ids only; or {declined: true}. DSAIL ruleset grammar (v1.3), the subset this service compiles to SMT: version 1.3; -- optional; 1.2 and 1.3 are accepted declare <name> as boolean; -- a yes/no claim declare <name> as numeric; -- a number; units go on literals (below) declare <name> as enum ["a","b"]; -- ORDERED vocabulary (comparable with < >) declare <name> as enum {"a","b"}; -- UNORDERED vocabulary (== and != only) declare local <name> as boolean;…

NameTypeReqDescription
label––Optional application-domain label: `{"topic": "<a few words on what the policy governs>"}`, or `{"declined": true}`. Matched against the published vocabulary and then discarded; never stored on the r…
parent_hash––The hash of the revision this one supersedes, when editing a saved ruleset. Links the two so the review can show a diff; omit for a new ruleset.
sourcestringyesThe DSAIL source text to compile: `declare` lines for each claim with their `// @ask`, `// @unit` and `// @range` annotations, then `assert` rules. Written only after the user has confirmed the Engli…

Structured output declared, but exposes no named fields.

No examples provided.

dsail_copy_ruleset ~251

Put a copy of one of your saved policy rulesets into a team. Use when a ruleset the user already has should also be available to a team — the usual way a new team gets its first library. Copies a saved ruleset from one of this user's workspaces into another. It is a copy: the original stays exactly where it was. `destination` and the optional `source` name a team or `personal`; `source` defaults to the workspace in use. The revisions it cites travel with it so a diff still works, but recorded approvals stay behind — an approval is one workspace's sign-off, so the copy arrives unapproved and must be approved there if the team needs that. A name already in use in the destination is refused rather than overwritten; `new_name` copies it under another.

NameTypeReqDescription
destinationstringyesThe workspace to copy into: a team's name or id, or `personal`.
namestringyesThe saved ruleset to copy, by name.
new_name––A different name for the copy, when the destination already uses `name`.
source––The workspace to copy from; defaults to the workspace in use.

Structured output declared, but exposes no named fields.

No examples provided.

dsail_create_team ~169

Start a team so colleagues share one set of policy rules. Use when the user says a colleague cannot see their rulesets, or wants work shared with named people rather than kept to themselves. Creates a team with a ruleset library of its own and makes this user its administrator. The team starts EMPTY: their existing rulesets stay in their own workspace and are not moved or copied; copying a ruleset is how work gets into it. A team has no allowance of its own: each member's checks in it count against that member's own account. `name` is a label shown to members, not an identifier, and does not have to be unique.

NameTypeReqDescription
namestringyesA label for the team, shown to its members. Not an identifier; need not be unique.

Structured output declared, but exposes no named fields.

No examples provided.

dsail_get_account_status ~246

Know how much of this credential's allowance is used before a limit interrupts a check. Use when an upcoming check could be interrupted by the account's allowance limit and the caller needs to see usage first. This account's entitlement and usage position. `usage` is the meter that refuses the next check — used, limit and remaining — and `stub: false` means it is enforced. Only checks are metered; compiling, editing, saving, loading and approving rulesets are free and stay free at any limit. When the tier is gated the payload carries `plans_url`, the address of a page describing the available plans. Also reports the current application-domain vocabulary version, whether this account may label rulesets, how many API keys it may still issue, and `terms` — the terms-of-service version that governs this tier with the URLs of the terms, privacy and data-handling pages. `account.project` is an internal identifier that names nothing a user would recognise. `account.organizations` lists the owner of the workspace currently in use (a team id while working in a team), not the teams the user belongs to; the workspace listing is where those are.

Input schema present but exposes no named parameters.

Structured output declared, but exposes no named fields.

No examples provided.

dsail_get_prompt_pack ~196

Get the exact questions to ask a document so the answers can be checked against a written policy. Use when reviewers pull different facts from the same kind of document, or the caller needs a consistent set of questions before applying decided rules. Returns the extraction contract for a compiled ruleset: one prompt per claim (question, answer format, vocabulary, unit), the claim JSON schema, and the exact validation rules a check enforces. The prompts are for the caller's own model to run; this service calls no model. The assembled claim dictionary is what a check takes.

NameTypeReqDescription
ruleset_hash––The content hash of an already compiled ruleset (from `dsail_compile` or a saved name). Give this OR `source`, not both.
source––DSAIL source text, byte for byte as compiled. Give this OR `ruleset_hash`; prefer the hash for anything already compiled.

Structured output declared, but exposes no named fields.

No examples provided.

dsail_invite_to_team ~158

Invite a colleague into a team by email address. Use when an administrator wants a specific colleague to reach the team's rulesets. Issues a single-use invitation to one email address. This service sends no mail, so what comes back is a link the administrator passes on themselves. Only the invited address can accept it, by signing in as that address, and only once, so a forwarded link is useless to anyone else. Restricted to the team's administrators.

NameTypeReqDescription
emailstringyesThe colleague's email address. Only that address can accept the invitation, and only once.
team_idstringyesThe team's id (`team-…`), as returned by `dsail_create_team` or `dsail_list_workspaces`.

Structured output declared, but exposes no named fields.

No examples provided.

dsail_issue_api_key ~114

Issues a REST API key for this account. The key authenticates calls to the DSAIL REST API, sent as the `x-jaxon-credential` header, and reaches the rulesets this account holds. Optional `label` records what the key is for. The token is returned once and cannot be recovered; the service keeps only a hash. An account has a limited number of keys.

NameTypeReqDescription
label––Optional label naming what the key is for (a service, a repository), shown in listings.

Structured output declared, but exposes no named fields.

No examples provided.

dsail_list_rulesets ~152

See which written policies already have rules a program can check. Use when a team may already have formalised the handbook or written criteria, and the caller needs to find existing rules before starting again. The rulesets saved in the workspace in use. On a client that renders MCP Apps this opens the ruleset library: one row per ruleset with its name, what it decides, how many questions it asks, how many rules it applies, whether anyone has approved it and when it last changed. A row opens that ruleset in the review widget, so the rows are already in front of the user. The `namespace` field is a service-internal identifier, not a name a person would recognise.

Input schema present but exposes no named parameters.

Structured output declared, but exposes no named fields.

No examples provided.

dsail_list_workspaces ~192

See which teams you work in and which one you are working in now. Use when a ruleset the user expects is missing from a listing, before saving something that belongs to a particular team, and whenever the user mentions a colleague, a team or sharing. Every workspace this user may work in — their own, plus one per team — and which one is currently in use. The current workspace decides what a listing shows and where a save writes. It does NOT decide who pays: every check is billed to the user's own account, in any workspace. `signed_in` says whether a person is behind this connection. When it is false the caller holds an API key, which names a workspace and not a person, so creating a team, inviting, removing and switching workspace are all refused; `remedy` is the command that signs the person in, and their key keeps working for everything else.

Input schema present but exposes no named parameters.

Structured output declared, but exposes no named fields.

No examples provided.

dsail_load_ruleset ~173

Read a saved policy ruleset exactly as it was stored. Use when someone asks which saved rules were used, or needs to inspect an existing revision rather than author a new one. Loads a named ruleset: its source, its hash, its claim manifest and claim schema, its diagnostics, its revision chain and any approvals bound to it — the same contract a compile returns, for bytes already stored. An approval follows the stored bytes, so source re-compiled from memory is a different object the moment the two texts drift; the `source` this returns, with the hash it came with as `parent_hash`, is the starting point for an edit. Loading shows nothing on screen.

NameTypeReqDescription
namestringyesThe saved ruleset's name, exactly as `dsail_list_rulesets` reports it.

Structured output declared, but exposes no named fields.

No examples provided.

dsail_open_review ~303

Show a person the rules a program will check, so they can approve exactly those bytes — here, by starting the local DSAIL review UI and opening it in their browser. Call this when a ruleset is ready for human review instead of telling the user to run `dsail serve` themselves. It starts a loopback server on this machine (outside any shell sandbox), opens the link in the default browser, and returns the link. Pass ONE of: `source` (the DSAIL text, byte-for-byte as compiled), `source_path` (a .dsail file in the repository), or `name` (a stored ruleset); nothing opens the ruleset library. The page shows the same review component the chat clients render; Approve there is recorded on the service against the exact hash. Always repeat the returned link to the user in your reply — the browser may not have opened on a remote or headless machine — and do not claim a review panel is open unless this tool returned a link.

NameTypeReqDescription
namestring–A stored ruleset name to load and show.
open_browserboolean–Open the link in the default browser (default true).
sourcestring–DSAIL source to compile and show.
source_pathstring–Path to a .dsail file to compile and show.
titlestring–Page title; defaults to the file or ruleset name.

No output schema declared.

No examples provided.

dsail_record_approval ~353

Bind a person's sign-off to the exact rules a program will check. Use when a reviewer has seen the formal rules and is ready to sign off, or revised rules need a fresh human approval. Binds a human approval to one exact ruleset hash. An approval follows the bytes, not the name: a later revision is not covered by it. `name` saves the ruleset under that name as part of approving it. The name is bound BEFORE the approval is recorded, so what a person approves is in their library afterwards instead of being reachable only by a hash they would have to have kept; it is optional only for a hash already saved under a name. `approver` and `note` are recorded with the approval. The review widget's approve control composes the exact arguments for this call, because a chat client cannot call tools from inside a widget.

NameTypeReqDescription
approverstringyesWho approved, as they wish to be recorded (a name or an email address).
label––Optional application-domain label: `{"topic": "<a few words on what the policy governs>"}`, or `{"declined": true}`. Matched against the published vocabulary and then discarded; never stored on the r…
name––The name to save the ruleset under before approving, when it is not saved yet. Approving saves first, so an approved hash is always reachable afterwards.
note––Optional free-text note recorded beside the approval.
ruleset_hashstringyesThe exact content hash the person approved. Approval binds to this hash only; a later revision needs its own.

Structured output declared, but exposes no named fields.

No examples provided.

dsail_remove_from_team ~209

Take somebody out of a team and cut off the keys they issued for it. Use when somebody has left the team or should no longer reach its rulesets. Removes a member. Their access ends on their next call, including through any API key they issued for this team, which is revoked. What they saved stays with the team — removing a person does not remove their work. A team is not left without an administrator: removing the last one is refused until somebody else has been promoted. `member` is their email address as the team's member list reports it, or the subject listed beside it. Restricted to the team's administrators.

NameTypeReqDescription
memberstringyesThe member: the `email` `dsail_team_members` reports for them (case does not matter), or the `subject` it reports beside it.
team_idstringyesThe team's id (`team-…`), as returned by `dsail_create_team` or `dsail_list_workspaces`.

Structured output declared, but exposes no named fields.

No examples provided.

dsail_save_ruleset ~395

Keep a written policy's rules as a named, immutable revision, so a later check answers exactly as this one did. Use when a handbook changes but earlier reviews must remain tied to the rules used then, or a team needs a name for a decided policy's formal rules. Stores a named, immutable revision of a ruleset. Saving over an existing name links the previous hash as this revision's parent — nothing is ever edited in place. Scoped to the workspace in use: a ruleset saved here is reachable from any later conversation through the same connection, and from no other. `created` is true when these exact bytes were stored for the first time, and false when an identical source had already been stored, by a compile or an earlier save. It says nothing about the name: the first save under a new name returns false if the same source was compiled before. `label` (optional, inert): {domain: <level-one id>, topic: <short phrase>, confidence: high|medium|low}, or {declined: true}. Stored as vocabulary ids only.

NameTypeReqDescription
label––Optional application-domain label: `{"topic": "<a few words on what the policy governs>"}`, or `{"declined": true}`. Matched against the published vocabulary and then discarded; never stored on the r…
namestringyesThe name to save under, in the current workspace. Saving over an existing name creates a new revision with the previous one as its parent; nothing is edited in place.
parent_hash––The hash of the revision this one supersedes, when editing a saved ruleset. Links the two so the review can show a diff; omit for a new ruleset.
sourcestringyesThe DSAIL source text to save, byte for byte as it compiled.

Structured output declared, but exposes no named fields.

No examples provided.

dsail_set_team_role ~234

Let another member administer a team, or stop them administering it. Use when the user wants somebody else able to invite and remove, or no longer able to. Makes a member an administrator, or returns an administrator to an ordinary member. `role` is `admin` or `member`. It does not change what they can read or write — every member already sees the whole library — only whether they can change who is in the team. `member` is their email address as the team's member list reports it, or the subject listed beside it. Demoting the last administrator is refused. Restricted to the team's administrators.

NameTypeReqDescription
memberstringyesThe member: the `email` `dsail_team_members` reports for them (case does not matter), or the `subject` it reports beside it.
rolestringyes`admin` (may invite, remove and promote) or `member` (reads and writes the library).
team_idstringyesThe team's id (`team-…`), as returned by `dsail_create_team` or `dsail_list_workspaces`.

Structured output declared, but exposes no named fields.

No examples provided.

dsail_team_members ~123

See who is in a team and who administers it. Use before removing somebody, changing who administers a team, or when the user asks who can see the team's rulesets. Who is in this team and what each one may do. Every member reads and writes the whole of the team's library; an administrator can additionally invite, remove and promote. Only a member of the team may ask.

NameTypeReqDescription
team_idstringyesThe team's id (`team-…`), as returned by `dsail_create_team` or `dsail_list_workspaces`.

Structured output declared, but exposes no named fields.

No examples provided.

dsail_unit_library ~272

Find out whether two units convert before a rule compares them, so the check does not answer UNKNOWN forever. Use when a document supplies a quantity in one unit while the written rule uses another, or a unit mismatch is leaving a comparison unresolved. What this project can convert between. DSAIL numerics are dimensional: a rule comparing a value in one unit against a literal in another resolves only if a converter bridges them, and if none does, that rule answers UNKNOWN for every claim dictionary, forever — which makes this worth knowing before rules that mix units are written. With `from_unit` and `to_unit` it answers for one pair with one of: same, convertible (with the factor), ambiguous (an interval-valued conversion such as months to days, which makes the comparison honestly UNKNOWN), unknown_unit (in no loaded library, so probably a typo), or no_path (both known, nothing bridges them). Currencies ship as alias groups with NO exchange rates: a rate is not a constant.

NameTypeReqDescription
from_unit––A unit symbol (`EUR`, `km`, `mo`). Give both `from_unit` and `to_unit` to ask whether that pair converts; give neither to list the whole library.
to_unit––The unit to convert into; paired with `from_unit`.

Structured output declared, but exposes no named fields.

No examples provided.

dsail_use_workspace ~128

Work in a different team, or in your own workspace. Use when the user wants to work on a different team's rulesets, or to go back to their own. Chooses which workspace this user's saving and listing happen in. `workspace` names a team by its name or its id, or is `personal` for their own workspace. The choice persists across sessions. If two of their teams share a name the call is refused and names the ids, rather than guessing.

NameTypeReqDescription
workspacestringyesA team's name or id, or `personal` for the user's own workspace.

Structured output declared, but exposes no named fields.

No examples provided.

Install

How do I install the DSAIL MCP server?

DSAIL runs locally as a PyPI package, launched with uvx dsail mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

pypi · dsail

# add to Claude Code
claude mcp add ai-jaxon-dsail -- uvx dsail mcp
Common questions

What is the DSAIL MCP server?

DSAIL is an MCP server listed in the public MCP registry as ai.jaxon/dsail. Turn a written policy into rules a program can check, and get the same answer every time. This page covers its PyPI package (dsail).

Is the DSAIL MCP server safe to use?

DSAIL scores 82 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the DSAIL MCP server expose?

DSAIL exposes 20 tools: dsail_compile, dsail_check, dsail_get_prompt_pack, dsail_save_ruleset, dsail_load_ruleset, and 15 more. Their descriptions and schemas cost roughly 6,327 tokens of context every time the server is loaded.

Is the DSAIL MCP server still maintained?

DSAIL is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the DSAIL MCP server under?

DSAIL declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

What did VerifyMCP test on the DSAIL MCP server?

VerifyMCP ran 16 checks on DSAIL, covering Malware scan, Known CVEs, Install scripts, Dependency health and 12 more. Endpoint Security and Transport & Reachability do not apply to a PyPI package, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.