contract-analyzer — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited contract-analyzer (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Extracts and risk-rates contract clauses from a PDF or scanned document using Mistral's native document AI. No third-party OCR dependency.
Profile requirements:
mistral_ocr + mistral_chat — available in core profile (default)files_upload (to upload a local PDF) — requires MISTRAL_MCP_PROFILE=fullEU data residency: both mistral_ocr and mistral_chat stay within Mistral's EU infrastructure when the API key is an EU-region key.
Ask the user for one of:
files_upload (requires MISTRAL_MCP_PROFILE=full), note the returned file_idCall mistral_ocr with document_annotation_format: "markdown" for structured extraction:
{
"document": {
"type": "document_url",
"documentUrl": "<URL from step 1>"
},
"document_annotation_format": "markdown"
}If using a file upload: "type": "document_id", "documentId": "<file_id>" instead.
Concatenate structuredContent.pages[*].markdown across all pages.
Pass the concatenated OCR text to mistral_chat with mistral-large-latest and a json_schema response format:
{
"model": "mistral-large-latest",
"temperature": 0,
"response_format": {
"type": "json_schema",
"json_schema": {
"name": "contract_analysis",
"strict": true,
"schema": {
"type": "object",
"properties": {
"parties": { "type": "array", "items": { "type": "string" } },
"effective_date": { "type": "string" },
"duration": { "type": "string" },
"governing_law": { "type": "string" },
"clauses": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": { "type": "string" },
"summary": { "type": "string" },
"risk_level": {
"type": "string",
"enum": ["low", "medium", "high", "critical"]
},
"risk_reason": { "type": "string" }
},
"required": ["title", "summary", "risk_level", "risk_reason"]
}
},
"overall_risk": {
"type": "string",
"enum": ["low", "medium", "high", "critical"]
},
"missing_protections": {
"type": "array",
"items": { "type": "string" }
}
},
"required": ["parties", "clauses", "overall_risk"]
}
}
},
"messages": [
{
"role": "user",
"content": "<OCR text>\n\nExtract all clauses from the contract above. For each clause, provide a title, one-sentence summary, and risk level (low/medium/high/critical) with the reason. Apply these risk escalation rules: termination-for-convenience → at least medium; unlimited liability → critical; IP assignment to other party → high; non-compete > 12 months → high; automatic renewal without notice → medium; governing law in foreign jurisdiction → medium."
}
]
}Present clauses sorted by risk level (critical → high → medium → low).
Show a summary box for critical and high-risk clauses:
⚠️ HIGH / CRITICAL CLAUSES
──────────────────────────────
[clause title] — [one-line risk reason]
...
FULL ANALYSIS
─────────────
[table or list of all clauses with risk level]
OVERALL RISK: [level]
MISSING PROTECTIONS: [list if any]Offer to pass the full JSON to mistral_chat for negotiation suggestions, or to french_legal_summary for a plain-language summary.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.