Server definition
- Hash
- sha256:9f0c7c7462ada4659025a14fc161c1e9233643c1c184d3761cafcbfd8356df08
- What it is
- What a remote MCP server returned when asked what it offers: 8 tools
The blob, as servednamed by its sha256
{
"instructions": null,
"tools": [
{
"description": "Pro-tier. Fetch and analyze a web page, then audit it against the Proximens GEO Engine principles across all major GEO dimensions (structured data, crawler access, content depth, freshness, E-E-A-T, multimodal). INPUT: url (required, http/https); optional mode (\"fast\" = quick signal checks, returns in seconds — the default; \"deep\" = a full AI-synthesized consultancy report in Dutch with a 7-dimension scorecard and sector benchmark, takes ~30-50s), client_name (report header), branche_hint (\"main:sub\", e.g. \"health_wellness:yoga_studio\"), max_issues (1-25, default 10). RETURNS: JSON with a 0-100 score, severity-ranked issues (critical/major/minor) each with a finding and an actionable suggestion, top recommendations, and a markdown report; deep mode additionally returns score_set (7 GEO dimensions), sector (benchmark cohort), and a full consultancy-grade report_markdown (deep_mode=\"timeout_fallback\" means the synthesis exceeded its budget and the fast result was returned instead). USE fast mode for quick checks and bulk triage; USE deep mode when you need a client-ready audit report. Free tier is blocked.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"branche_hint": {
"description": "Branche hint in \"main:sub\" format, e.g. \"health_wellness:yoga_studio\". If omitted, principles are matched without branche filter.",
"type": "string"
},
"client_name": {
"description": "Optional client identifier for the audit report header",
"type": "string"
},
"max_issues": {
"default": 10,
"description": "Maximum issues to return (default 10)",
"maximum": 25,
"minimum": 1,
"type": "integer"
},
"mode": {
"default": "fast",
"description": "fast = quick signal checks (seconds); deep = full AI-synthesized consultancy report with sector benchmark (~30-50s)",
"enum": [
"fast",
"deep"
],
"type": "string"
},
"url": {
"description": "Target URL to audit",
"format": "uri",
"type": "string"
}
},
"required": [
"url"
],
"type": "object"
},
"name": "proximens_geo_audit_url",
"outputSchema": {
"additionalProperties": false,
"properties": {
"_meta": {
"additionalProperties": false,
"properties": {
"processed_at": {
"type": "string"
},
"rate_limit_remaining": {
"anyOf": [
{
"type": "number"
},
{
"const": "unlimited",
"type": "string"
}
]
},
"tier": {
"enum": [
"free",
"pro",
"enterprise"
],
"type": "string"
}
},
"required": [
"tier",
"rate_limit_remaining",
"processed_at"
],
"type": "object"
},
"_wm": {
"type": "string"
},
"audit_id": {
"format": "uuid",
"type": "string"
},
"deep_mode": {
"description": "Deep-mode outcome: ok = full synthesized report; timeout_fallback = synthesis exceeded budget, fast result returned",
"enum": [
"ok",
"timeout_fallback"
],
"type": "string"
},
"error": {
"type": "string"
},
"matched_principles": {
"items": {
"additionalProperties": false,
"properties": {
"category": {
"type": "string"
},
"confidence": {
"maximum": 1,
"minimum": 0,
"type": "number"
},
"excerpt": {
"type": "string"
},
"finding": {
"type": "string"
},
"principle_id": {
"format": "uuid",
"type": "string"
},
"principle_title": {
"type": "string"
},
"severity": {
"enum": [
"critical",
"major",
"minor"
],
"type": "string"
},
"suggestion": {
"type": "string"
}
},
"required": [
"principle_id",
"principle_title",
"category",
"severity",
"finding",
"suggestion",
"confidence"
],
"type": "object"
},
"type": "array"
},
"recommendations": {
"items": {
"type": "string"
},
"type": "array"
},
"report_markdown": {
"type": "string"
},
"score": {
"maximum": 100,
"minimum": 0,
"type": "number"
},
"score_set": {
"additionalProperties": false,
"description": "7-dimension GEO scorecard (deep mode only)",
"properties": {
"aiCitability": {
"type": [
"number",
"null"
]
},
"brandAuthority": {
"type": [
"number",
"null"
]
},
"contentEEAT": {
"type": [
"number",
"null"
]
},
"overallGEO": {
"type": [
"number",
"null"
]
},
"platformOptimization": {
"type": [
"number",
"null"
]
},
"structuredData": {
"type": [
"number",
"null"
]
},
"technicalGEO": {
"type": [
"number",
"null"
]
}
},
"required": [
"overallGEO",
"aiCitability",
"brandAuthority",
"contentEEAT",
"technicalGEO",
"structuredData",
"platformOptimization"
],
"type": "object"
},
"sector": {
"additionalProperties": false,
"description": "Detected sector benchmark cohort (deep mode only)",
"properties": {
"display_name_nl": {
"type": "string"
},
"slug": {
"type": "string"
}
},
"required": [
"slug",
"display_name_nl"
],
"type": "object"
},
"signals": {
"additionalProperties": false,
"properties": {
"h1_count": {
"minimum": 0,
"type": "integer"
},
"has_canonical": {
"type": "boolean"
},
"has_viewport": {
"type": "boolean"
},
"hreflang_count": {
"minimum": 0,
"type": "integer"
},
"images_total": {
"minimum": 0,
"type": "integer"
},
"images_without_alt": {
"minimum": 0,
"type": "integer"
},
"render_source": {
"enum": [
"firecrawl",
"fetch-fallback"
],
"type": "string"
},
"schema_flags": {
"additionalProperties": false,
"properties": {
"article": {
"type": "boolean"
},
"breadcrumbList": {
"type": "boolean"
},
"faqPage": {
"type": "boolean"
},
"localBusiness": {
"type": "boolean"
},
"organization": {
"type": "boolean"
},
"product": {
"type": "boolean"
},
"website": {
"type": "boolean"
}
},
"required": [
"organization",
"website",
"faqPage",
"product",
"breadcrumbList",
"localBusiness",
"article"
],
"type": "object"
},
"schema_types": {
"items": {
"type": "string"
},
"type": "array"
},
"structured_data_invalid": {
"minimum": 0,
"type": "integer"
},
"structured_data_valid": {
"minimum": 0,
"type": "integer"
},
"word_count": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"structured_data_valid",
"structured_data_invalid",
"schema_types",
"schema_flags",
"h1_count",
"images_total",
"images_without_alt",
"has_canonical",
"hreflang_count",
"has_viewport",
"word_count",
"render_source"
],
"type": "object"
},
"status": {
"enum": [
"complete",
"failed"
],
"type": "string"
},
"url": {
"type": "string"
}
},
"required": [
"audit_id",
"url",
"status"
],
"type": "object"
}
},
{
"description": "Pro-tier. Run many GEO-principle searches in a single fast call. INPUT: queries (array of 2-100 natural-language strings, each 3-500 chars); optional top_k_per_query (1-10, default 5) and category filter. RETURNS: JSON with a results array (per query: the query, its matched principles, and a count), plus total_queries, total_matches and processing time. USE WHEN you need many lookups at once, e.g. a full-site audit or a keyword list, instead of repeated search_principles calls.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"category": {
"enum": [
"technical",
"structured-data",
"content",
"ai-search",
"freshness",
"multimodal",
"user-signals",
"e-e-a-t",
"mobile",
"performance",
"query-intent",
"internal-linking",
"other"
],
"type": "string"
},
"queries": {
"items": {
"maxLength": 500,
"minLength": 3,
"type": "string"
},
"maxItems": 100,
"minItems": 2,
"type": "array"
},
"top_k_per_query": {
"default": 5,
"maximum": 10,
"minimum": 1,
"type": "number"
}
},
"required": [
"queries"
],
"type": "object"
},
"name": "proximens_geo_bulk_search",
"outputSchema": {
"additionalProperties": false,
"properties": {
"_meta": {
"additionalProperties": false,
"properties": {
"processed_at": {
"type": "string"
},
"processing_time_ms": {
"type": "number"
},
"rate_limit_remaining": {
"anyOf": [
{
"type": "number"
},
{
"const": "unlimited",
"type": "string"
}
]
},
"tier": {
"enum": [
"free",
"pro",
"enterprise"
],
"type": "string"
}
},
"required": [
"tier",
"rate_limit_remaining",
"processing_time_ms",
"processed_at"
],
"type": "object"
},
"results": {
"items": {
"additionalProperties": false,
"properties": {
"count": {
"type": "number"
},
"matches": {
"items": {
"additionalProperties": false,
"properties": {
"_wm": {
"type": "string"
},
"category": {
"type": "string"
},
"confidence": {
"maximum": 1,
"minimum": 0,
"type": "number"
},
"evidence_count": {
"minimum": 0,
"type": "integer"
},
"full_text": {
"type": "string"
},
"id": {
"format": "uuid",
"type": "string"
},
"similarity": {
"type": [
"number",
"null"
]
},
"source_type": {
"type": [
"string",
"null"
]
},
"source_url": {
"anyOf": [
{
"format": "uri",
"type": "string"
},
{
"type": "null"
}
]
},
"summary": {
"type": "string"
},
"title": {
"type": "string"
},
"upgrade_hint": {
"type": "string"
}
},
"required": [
"id",
"title",
"summary",
"category",
"confidence"
],
"type": "object"
},
"type": "array"
},
"query": {
"type": "string"
}
},
"required": [
"query",
"matches",
"count"
],
"type": "object"
},
"type": "array"
},
"total_matches": {
"type": "number"
},
"total_queries": {
"type": "number"
}
},
"required": [
"results",
"total_queries",
"total_matches"
],
"type": "object"
}
},
{
"description": "Pro-tier. Fetch two web pages (your URL and a competitor's) and audit both against the Proximens GEO Engine principles using the same audit engine as audit_url, then compute the delta. INPUT: self_url and competitor_url (both required, http/https). RETURNS: JSON with a 0-100 score per URL (same scoring as audit_url), the principles each page satisfies, the principles each page VIOLATES that the other satisfies (delta_principles), and strategic insights on where to close the gap. USE WHEN you want a competitive GEO gap analysis between your page and a rival's.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"competitor_url": {
"description": "Competitor URL to compare against",
"format": "uri",
"type": "string"
},
"self_url": {
"description": "Your URL to audit",
"format": "uri",
"type": "string"
}
},
"required": [
"self_url",
"competitor_url"
],
"type": "object"
},
"name": "proximens_geo_compare_urls",
"outputSchema": {
"additionalProperties": false,
"properties": {
"_meta": {
"additionalProperties": false,
"properties": {
"processed_at": {
"type": "string"
},
"rate_limit_remaining": {
"anyOf": [
{
"type": "number"
},
{
"const": "unlimited",
"type": "string"
}
]
},
"tier": {
"enum": [
"free",
"pro",
"enterprise"
],
"type": "string"
}
},
"required": [
"tier",
"rate_limit_remaining",
"processed_at"
],
"type": "object"
},
"competitor_matched": {
"items": {
"$ref": "#/properties/self_matched/items"
},
"type": "array"
},
"competitor_score": {
"maximum": 100,
"minimum": 0,
"type": "number"
},
"competitor_url": {
"type": "string"
},
"delta_principles": {
"additionalProperties": false,
"properties": {
"missing_on_competitor": {
"items": {
"$ref": "#/properties/self_matched/items"
},
"type": "array"
},
"missing_on_self": {
"items": {
"$ref": "#/properties/self_matched/items"
},
"type": "array"
}
},
"required": [
"missing_on_self",
"missing_on_competitor"
],
"type": "object"
},
"error": {
"type": "string"
},
"insights": {
"items": {
"type": "string"
},
"type": "array"
},
"self_matched": {
"items": {
"additionalProperties": false,
"properties": {
"_wm": {
"type": "string"
},
"category": {
"type": "string"
},
"confidence": {
"maximum": 1,
"minimum": 0,
"type": "number"
},
"evidence_count": {
"minimum": 0,
"type": "integer"
},
"full_text": {
"type": "string"
},
"id": {
"format": "uuid",
"type": "string"
},
"similarity": {
"type": [
"number",
"null"
]
},
"source_type": {
"type": [
"string",
"null"
]
},
"source_url": {
"anyOf": [
{
"format": "uri",
"type": "string"
},
{
"type": "null"
}
]
},
"summary": {
"type": "string"
},
"title": {
"type": "string"
},
"upgrade_hint": {
"type": "string"
}
},
"required": [
"id",
"title",
"summary",
"category",
"confidence"
],
"type": "object"
},
"type": "array"
},
"self_score": {
"maximum": 100,
"minimum": 0,
"type": "number"
},
"self_url": {
"type": "string"
}
},
"required": [
"self_url",
"competitor_url",
"self_score",
"competitor_score",
"self_matched",
"competitor_matched",
"delta_principles",
"insights"
],
"type": "object"
}
},
{
"description": "Fetch one GEO principle from the Proximens GEO Engine by its UUID. INPUT: id (UUID, normally taken from a prior search_principles result). RETURNS: a single principle as JSON with id, title, summary, category and confidence; Pro/Enterprise tiers additionally return full_text, source_url, source_type, evidence_count and the last-validated timestamp. USE WHEN you already have a principle id and need its full detail — typically to drill down after search_principles.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"id": {
"description": "Principle UUID (from search_principles results)",
"format": "uuid",
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "proximens_geo_get_principle",
"outputSchema": {
"additionalProperties": false,
"properties": {
"_wm": {
"type": "string"
},
"branches": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"additionalProperties": false,
"properties": {
"main": {
"enum": [
"local_services",
"digital_services",
"product_commerce",
"creative_professional",
"health_wellness",
"b2b_saas",
"universal"
],
"type": "string"
},
"relevance": {
"maximum": 3,
"minimum": 0,
"type": "integer"
},
"subs": {
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"main",
"subs",
"relevance"
],
"type": "object"
}
]
},
"type": "array"
},
"category": {
"type": "string"
},
"confidence": {
"maximum": 1,
"minimum": 0,
"type": "number"
},
"evidence_count": {
"minimum": 0,
"type": "integer"
},
"full_text": {
"type": "string"
},
"id": {
"format": "uuid",
"type": "string"
},
"last_validated_at": {
"type": [
"string",
"null"
]
},
"similarity": {
"type": [
"number",
"null"
]
},
"source_diversity": {
"minimum": 0,
"type": "integer"
},
"source_type": {
"type": [
"string",
"null"
]
},
"source_url": {
"anyOf": [
{
"format": "uri",
"type": "string"
},
{
"type": "null"
}
]
},
"summary": {
"type": "string"
},
"title": {
"type": "string"
},
"upgrade_hint": {
"type": "string"
}
},
"required": [
"id",
"title",
"summary",
"category",
"confidence"
],
"type": "object"
}
},
{
"description": "Return live aggregate statistics for the Proximens GEO Engine knowledge base. INPUT: none. RETURNS: JSON with total_principles (high-confidence count), total_categories, and on Pro/Enterprise also extended quality metrics (full corpus size and a confidence_distribution) plus the last-validated timestamp. USE WHEN you need to gauge the size and quality of the corpus before relying on it.",
"inputSchema": {
"additionalProperties": false,
"description": "No input parameters",
"properties": {},
"type": "object"
},
"name": "proximens_geo_get_stats",
"outputSchema": {
"additionalProperties": false,
"properties": {
"confidence_distribution": {
"additionalProperties": false,
"properties": {
"0.7-0.8": {
"minimum": 0,
"type": "integer"
},
"0.8-0.9": {
"minimum": 0,
"type": "integer"
},
"<0.7": {
"minimum": 0,
"type": "integer"
},
">=0.9": {
"minimum": 0,
"type": "integer"
}
},
"required": [
">=0.9",
"0.8-0.9",
"0.7-0.8",
"<0.7"
],
"type": "object"
},
"fetched_at": {
"type": "string"
},
"last_distillation_at": {
"type": [
"string",
"null"
]
},
"last_validated_at": {
"type": [
"string",
"null"
]
},
"tier_hint": {
"type": "string"
},
"total_categories": {
"minimum": 0,
"type": "integer"
},
"total_evaluated": {
"minimum": 0,
"type": "integer"
},
"total_principles": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"total_principles",
"total_categories"
],
"type": "object"
}
},
{
"description": "List the GEO principle taxonomy of the Proximens GEO Engine with a live count of high-confidence principles per category. INPUT: none. RETURNS: JSON with a categories array of {category, count, description} sorted by count, plus a reconciled total that matches get_stats.total_principles. Categories: technical, structured-data, ai-search, content, e-e-a-t, freshness, multimodal, user-signals, performance, query-intent, internal-linking, mobile, other. USE WHEN you want to discover which categories exist before narrowing a search_principles call with the category filter.",
"inputSchema": {
"additionalProperties": false,
"description": "No input parameters",
"properties": {},
"type": "object"
},
"name": "proximens_geo_list_categories",
"outputSchema": {
"additionalProperties": false,
"properties": {
"cached": {
"type": "boolean"
},
"categories": {
"items": {
"additionalProperties": false,
"properties": {
"category": {
"type": "string"
},
"count": {
"minimum": 0,
"type": "integer"
},
"description": {
"type": "string"
}
},
"required": [
"category",
"count"
],
"type": "object"
},
"type": "array"
},
"total": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"categories",
"total",
"cached"
],
"type": "object"
}
},
{
"description": "Semantic search over the Proximens GEO Engine: a curated, continuously-updated knowledge base of 4.000+ verified Generative Engine Optimization (GEO/AEO) principles, each graded by a 0-1 confidence score and traceable to a verified source. INPUT: query (natural language, 3-500 chars); optional category (one of 13 GEO categories), top_k (1-25, default 10), min_confidence (0-1, default 0.5). RETURNS: ranked principles as JSON, each with id, title, summary, category, confidence and a relevance score; Pro/Enterprise tiers additionally return full_text and source. USE WHEN you need evidence-backed answers about how AI search engines (ChatGPT, Perplexity, Gemini, Google AI Overviews, Copilot) select, rank and cite web content.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"category": {
"description": "Filter by category (one of 13 GEO categories)",
"enum": [
"technical",
"structured-data",
"content",
"ai-search",
"freshness",
"multimodal",
"user-signals",
"e-e-a-t",
"mobile",
"performance",
"query-intent",
"internal-linking",
"other"
],
"type": "string"
},
"min_confidence": {
"default": 0.5,
"description": "Minimum confidence score (0-1). Default 0.5 filters noise; raise to 0.8+ for high-confidence claims only",
"maximum": 1,
"minimum": 0,
"type": "number"
},
"query": {
"description": "Natural-language search query (e.g. \"schema markup for local businesses\" or \"how to optimize for ChatGPT citations\")",
"maxLength": 500,
"minLength": 3,
"type": "string"
},
"top_k": {
"default": 10,
"description": "Number of principles to return (max 25)",
"maximum": 25,
"minimum": 1,
"type": "integer"
}
},
"required": [
"query"
],
"type": "object"
},
"name": "proximens_geo_search_principles",
"outputSchema": {
"additionalProperties": false,
"properties": {
"query_used": {
"type": "string"
},
"results": {
"items": {
"additionalProperties": false,
"properties": {
"_wm": {
"type": "string"
},
"category": {
"type": "string"
},
"confidence": {
"maximum": 1,
"minimum": 0,
"type": "number"
},
"evidence_count": {
"minimum": 0,
"type": "integer"
},
"full_text": {
"type": "string"
},
"id": {
"format": "uuid",
"type": "string"
},
"similarity": {
"description": "Relevance score for the query (0-1)",
"maximum": 1,
"minimum": 0,
"type": "number"
},
"source_type": {
"type": [
"string",
"null"
]
},
"source_url": {
"anyOf": [
{
"format": "uri",
"type": "string"
},
{
"type": "null"
}
]
},
"summary": {
"type": "string"
},
"title": {
"type": "string"
},
"upgrade_hint": {
"type": "string"
}
},
"required": [
"id",
"title",
"summary",
"category",
"confidence"
],
"type": "object"
},
"type": "array"
},
"tier_note": {
"description": "Free-tier hint when top_k was capped",
"type": "string"
},
"total_in_database": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"results",
"query_used",
"total_in_database"
],
"type": "object"
}
},
{
"description": "Generate a structured, GEO-optimized content brief for a topic using the Proximens GEO Engine. INPUT: topic (3-200 chars); optional target_branche (one of 7 verticals), word_count_target (300-5000, default 1500) and up to 3 competitor_urls. RETURNS: JSON with a suggested H1 and H2 section structure with key points, the principles the content should address, and (Pro/Enterprise) FAQ suggestions and recommended schema.org markup. USE WHEN you need to brief a writer so a page is built to be cited by AI search engines.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"competitor_urls": {
"items": {
"format": "uri",
"type": "string"
},
"maxItems": 3,
"type": "array"
},
"target_branche": {
"enum": [
"local_services",
"digital_services",
"product_commerce",
"creative_professional",
"health_wellness",
"b2b_saas",
"universal"
],
"type": "string"
},
"topic": {
"maxLength": 200,
"minLength": 3,
"type": "string"
},
"word_count_target": {
"default": 1500,
"maximum": 5000,
"minimum": 300,
"type": "number"
}
},
"required": [
"topic"
],
"type": "object"
},
"name": "proximens_geo_synthesize_brief",
"outputSchema": {
"additionalProperties": false,
"properties": {
"_meta": {
"additionalProperties": false,
"properties": {
"processed_at": {
"type": "string"
},
"rate_limit_remaining": {
"anyOf": [
{
"type": "number"
},
{
"const": "unlimited",
"type": "string"
}
]
},
"tier": {
"enum": [
"free",
"pro",
"enterprise"
],
"type": "string"
}
},
"required": [
"tier",
"rate_limit_remaining",
"processed_at"
],
"type": "object"
},
"brief_id": {
"format": "uuid",
"type": "string"
},
"estimated_word_count": {
"type": "number"
},
"faq_suggestions": {
"items": {
"additionalProperties": false,
"properties": {
"a_hint": {
"type": "string"
},
"q": {
"type": "string"
}
},
"required": [
"q",
"a_hint"
],
"type": "object"
},
"type": "array"
},
"principles_to_address": {
"items": {
"additionalProperties": false,
"properties": {
"_wm": {
"type": "string"
},
"category": {
"type": "string"
},
"confidence": {
"maximum": 1,
"minimum": 0,
"type": "number"
},
"evidence_count": {
"minimum": 0,
"type": "integer"
},
"full_text": {
"type": "string"
},
"id": {
"format": "uuid",
"type": "string"
},
"similarity": {
"type": [
"number",
"null"
]
},
"source_type": {
"type": [
"string",
"null"
]
},
"source_url": {
"anyOf": [
{
"format": "uri",
"type": "string"
},
{
"type": "null"
}
]
},
"summary": {
"type": "string"
},
"title": {
"type": "string"
},
"upgrade_hint": {
"type": "string"
}
},
"required": [
"id",
"title",
"summary",
"category",
"confidence"
],
"type": "object"
},
"type": "array"
},
"schema_markup": {
"items": {
"additionalProperties": false,
"properties": {
"rationale": {
"type": "string"
},
"type": {
"type": "string"
}
},
"required": [
"type",
"rationale"
],
"type": "object"
},
"type": "array"
},
"suggested_structure": {
"additionalProperties": false,
"properties": {
"h1": {
"type": "string"
},
"sections": {
"items": {
"additionalProperties": false,
"properties": {
"h2": {
"type": "string"
},
"key_points": {
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"h2",
"key_points"
],
"type": "object"
},
"type": "array"
}
},
"required": [
"h1",
"sections"
],
"type": "object"
},
"topic": {
"type": "string"
}
},
"required": [
"brief_id",
"topic",
"suggested_structure",
"principles_to_address",
"estimated_word_count"
],
"type": "object"
}
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:9f0c7c7462ada4659025a14fc161c1e9233643c1c184d3761cafcbfd8356df08 | sha256sum