Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,071Paid calls: 1,551Letters: 14Defects: 1,323counted 3 min ago
teppi

Server definition

Hash
sha256:84a82604d25c1f06261089ae44b8257fd5af6e7b8e9658d1e856626d068d3b87
What it is
What a remote MCP server returned when asked what it offers: 12 tools

The blob, as servednamed by its sha256

{ "instructions": "Foliora improves public sources a company owns so it can be found on Google and cited by ChatGPT and Gemini. You are acting with the customer's credentials on their live website. Rules. (1) Start with list_sites and list_page_jobs; every row's `fix` carries the customer-facing state and `nextAction` — do what nextAction says and nothing else; on `wait` or `none` do nothing and do not poll. (2) Approving is the customer's decision, never yours: call get_page_job, show them every operation's exact before and after, and call approve_change only when they say approve, with that response's canonicalHash. Never approve a row labelled Needs a hand. If fix.publisherReady is true, tell them approval publishes to the live site at once. (3) Apply only when nextAction is `publish`: get_approved_change, then each operation in ordinal order with the exact after value — no rewording, no extra edits. If the live page does not match an operation's before value, stop and tell the customer; do not force it. (4) report_publication once, every ordinal exactly, values character for character, a stable idempotencyKey, then stop — Foliora verifies the page itself. After a mismatch, fix the page and resend the same receipt; never invent a new one. (5) Findings: fix on the site first, then report_finding_fix, only for agentCanFix findings; never report what you did not fix, never rewrite page copy from a finding. (6) Never send site, CMS, hosting or GitHub credentials to a Foliora tool. Never claim a change is live, verified or cited unless `fix` says so. Recrawl, re-verify and re-ask are not tools: they are Foliora's, not decisions. create_preview_link does not start a crawl — send the human to previewUrl. Canonical product facts: https://www.foliora.ai/preview", "tools": [ { "description": "Approve one drafted change set by its exact canonical hash. Call this only after the customer has read the operations from get_page_job and told you to approve that hash. A stale or mismatched hash is refused. Approval is the customer's only decision: on a site with a connected publisher Foliora publishes and verifies from here on its own (fix.publisherReady true); otherwise the agent applies the exact operations and calls report_publication. Requires OAuth or an API key with the approve scope.", "inputSchema": { "additionalProperties": false, "properties": { "changeSetId": { "format": "uuid", "type": "string" }, "expectedHash": { "pattern": "^[0-9a-f]{64}$", "type": "string" } }, "required": [ "changeSetId", "expectedHash" ], "type": "object" }, "name": "approve_change", "outputSchema": { "additionalProperties": false, "properties": { "approvedAt": { "type": [ "string", "null" ] }, "approvedVia": { "type": "string" }, "canonicalHash": { "type": "string" }, "changeSetId": { "type": "string" }, "status": { "type": "string" } }, "required": [ "changeSetId", "approvedVia" ], "type": "object" } }, { "description": "Build a Foliora /preview URL for a public website. Does not crawl, does not take credentials, and does not change the site. Send the human to the returned previewUrl so they can start the snapshot in a browser.", "inputSchema": { "additionalProperties": false, "properties": { "websiteUrl": { "description": "Public website URL or host. https is optional.", "minLength": 1, "type": "string" } }, "required": [ "websiteUrl" ], "type": "object" }, "name": "create_preview_link", "outputSchema": { "additionalProperties": false, "properties": { "host": { "type": "string" }, "previewUrl": { "format": "uri", "type": "string" }, "websiteUrl": { "format": "uri", "type": "string" } }, "required": [ "previewUrl", "websiteUrl", "host" ], "type": "object" } }, { "description": "Return an already-approved canonical hash and its ordered typed operations. Apply exactly these values; do not reinterpret or regenerate them.", "inputSchema": { "additionalProperties": false, "properties": { "changeSetId": { "format": "uuid", "type": "string" } }, "required": [ "changeSetId" ], "type": "object" }, "name": "get_approved_change", "outputSchema": { "additionalProperties": false, "properties": { "approvedAt": { "type": "string" }, "brief": { "type": "string" }, "canonicalHash": { "type": "string" }, "changeSetId": { "type": "string" }, "host": { "type": "string" }, "jobId": { "type": "string" }, "operations": { "type": "array" }, "rationale": { "type": "string" }, "siteId": { "type": "string" }, "title": { "type": "string" } }, "required": [ "changeSetId", "siteId", "host", "jobId", "title", "rationale", "brief", "canonicalHash", "approvedAt", "operations" ], "type": "object" } }, { "description": "One proposed page change: why Foliora proposes it, the brief, the objectives it addresses, the drafted change set with every operation's exact before and after values and its canonical hash, and `fix` — its customer-facing state, reason, live finding statuses, older editions and nextAction. A stale edition is readable history with a null hash; it can never be approved. Read this with the customer before approve_change; never paraphrase the operations as approved text.", "inputSchema": { "additionalProperties": false, "properties": { "jobId": { "format": "uuid", "type": "string" } }, "required": [ "jobId" ], "type": "object" }, "name": "get_page_job", "outputSchema": { "additionalProperties": false, "properties": { "brief": { "type": "string" }, "changeSet": { "type": [ "object", "null" ] }, "citationGap": { "type": "string" }, "citationObjectives": { "type": "array" }, "competingHosts": { "type": "array" }, "compile": { "type": [ "object", "null" ] }, "createdAt": { "type": "string" }, "findingObjectives": { "type": "array" }, "host": { "type": "string" }, "impactScore": { "type": "number" }, "jobId": { "type": "string" }, "rationale": { "type": "string" }, "searchObjectives": { "type": "array" }, "siteId": { "type": "string" }, "status": { "type": "string" }, "targetUrl": { "type": "string" }, "title": { "type": "string" } }, "required": [ "jobId", "siteId", "host", "targetUrl", "title", "rationale", "brief", "impactScore", "status", "changeSet" ], "type": "object" } }, { "description": "Return Foliora product facts: brand, per-site plans, canonical URLs, and product boundaries. Use when the user asks what Foliora is, how much it costs, or which URL to open. Does not crawl a site.", "inputSchema": { "additionalProperties": false, "properties": {}, "type": "object" }, "name": "get_product", "outputSchema": { "additionalProperties": false, "properties": { "addons": { "items": { "type": "object" }, "type": "array" }, "brand": { "type": "string" }, "category": { "type": "string" }, "doesNot": { "items": { "type": "string" }, "type": "array" }, "hero": { "type": "string" }, "links": { "additionalProperties": { "format": "uri", "type": "string" }, "type": "object" }, "mcpUrl": { "format": "uri", "type": "string" }, "plans": { "items": { "type": "object" }, "type": "array" }, "previewUrl": { "format": "uri", "type": "string" }, "pricingUrl": { "format": "uri", "type": "string" }, "support": { "type": "string" }, "workflow": { "type": "string" } }, "required": [ "brand", "category", "hero", "workflow", "previewUrl", "mcpUrl", "pricingUrl", "support", "plans", "addons", "links", "doesNot" ], "type": "object" } }, { "description": "Fetch a Foliora preview snapshot the human already started. Requires the 32-character hex token from /preview/{token}. Returns public findings and pages only. Unknown tokens are not_found. Does not start a crawl.", "inputSchema": { "additionalProperties": false, "properties": { "token": { "description": "Public snapshot token from a Foliora preview URL.", "pattern": "^[0-9a-fA-F]{32}$", "type": "string" } }, "required": [ "token" ], "type": "object" }, "name": "get_snapshot", "outputSchema": { "additionalProperties": false, "properties": { "aiPresence": { "type": [ "object", "null" ] }, "errorCode": { "type": [ "string", "null" ] }, "findings": { "items": { "additionalProperties": false, "properties": { "code": { "type": "string" }, "evidenceUrl": { "type": [ "string", "null" ] }, "severity": { "type": "string" }, "summary": { "type": "string" } }, "required": [ "code", "severity", "summary", "evidenceUrl" ], "type": "object" }, "type": "array" }, "googlePresence": { "type": [ "object", "null" ] }, "host": { "type": "string" }, "locked": { "type": "boolean" }, "pageCount": { "type": "number" }, "pages": { "items": { "additionalProperties": false, "properties": { "canonical": { "type": [ "string", "null" ] }, "description": { "type": [ "string", "null" ] }, "h1": { "type": [ "string", "null" ] }, "title": { "type": [ "string", "null" ] }, "url": { "type": "string" }, "wordCount": { "type": [ "number", "null" ] } }, "required": [ "url", "title", "h1", "canonical", "description", "wordCount" ], "type": "object" }, "type": "array" }, "phase": { "type": [ "string", "null" ] }, "processing": { "type": "boolean" }, "status": { "type": "string" }, "token": { "type": "string" }, "websiteUrl": { "type": "string" } }, "required": [ "token", "host", "websiteUrl", "pageCount", "status", "phase", "googlePresence", "aiPresence", "findings", "pages", "errorCode", "locked", "processing" ], "type": "object" } }, { "description": "List the crawl findings still open on a site: SEO and AI-readiness plumbing such as missing descriptions, blocked AI crawlers, missing llms.txt, stale articles. Each row carries a code, severity, evidence URL, and plain-language fix guidance. Read-only.", "inputSchema": { "additionalProperties": false, "properties": { "siteId": { "format": "uuid", "type": "string" }, "status": { "enum": [ "backlog", "open", "regressed", "fix_reported", "resolved", "ignored", "all" ], "type": "string" } }, "required": [ "siteId" ], "type": "object" }, "name": "list_findings", "outputSchema": { "additionalProperties": false, "properties": { "findings": { "items": { "type": "object" }, "type": "array" } }, "required": [ "findings" ], "type": "object" } }, { "description": "The page changes Foliora proposes for one owned site, highest impact first — the same list the customer's dashboard shows. Each row carries `fix`: the customer-facing state (Foliora is working / Your turn / Published / Verified live / Needs a hand), why there is no draft to act on when there is none, the live status of every finding it set out to fix, and nextAction. Use get_page_job to read a proposal in full before the customer decides.", "inputSchema": { "additionalProperties": false, "properties": { "siteId": { "format": "uuid", "type": "string" }, "status": { "enum": [ "proposed", "all" ], "type": "string" } }, "required": [ "siteId" ], "type": "object" }, "name": "list_page_jobs", "outputSchema": { "additionalProperties": false, "properties": { "jobs": { "items": { "type": "object" }, "type": "array" } }, "required": [ "jobs" ], "type": "object" } }, { "description": "List sites owned by the authenticated Foliora account with crawl and finding status. Requires OAuth or a Foliora API key with read scope.", "inputSchema": { "additionalProperties": false, "properties": {}, "type": "object" }, "name": "list_sites", "outputSchema": { "additionalProperties": false, "properties": { "sites": { "items": { "type": "object" }, "type": "array" } }, "required": [ "sites" ], "type": "object" } }, { "description": "Close one drafted change set without approving it. Call this only when the customer says so. The job stays proposed and can be drafted again later. Requires OAuth or an API key with the approve scope.", "inputSchema": { "additionalProperties": false, "properties": { "changeSetId": { "format": "uuid", "type": "string" } }, "required": [ "changeSetId" ], "type": "object" }, "name": "reject_change", "outputSchema": { "additionalProperties": false, "properties": { "changeSetId": { "type": "string" }, "rejectedVia": { "type": "string" }, "status": { "type": "string" } }, "required": [ "changeSetId", "rejectedVia" ], "type": "object" } }, { "description": "After the agent fixes a finding on the site (a meta description, a robots rule, llms.txt), mark it fix_reported with a short note. It shows as done on the customer's Fixes list; Foliora's next scheduled read confirms it as resolved or reopens it. The report is never taken on faith. Requires execute access.", "inputSchema": { "additionalProperties": false, "properties": { "findingId": { "format": "uuid", "type": "string" }, "note": { "maxLength": 500, "type": "string" } }, "required": [ "findingId" ], "type": "object" }, "name": "report_finding_fix", "outputSchema": { "additionalProperties": false, "properties": { "findingId": { "type": "string" }, "fixReportedAt": { "type": [ "string", "null" ] }, "fixReportedBy": { "type": [ "string", "null" ] }, "status": { "type": "string" } }, "required": [ "findingId", "status" ], "type": "object" } }, { "description": "Record proof that the customer's agent applied every operation from an already-approved canonical hash. Foliora verifies the live page from here on its own and the change shows as done on the customer's dashboard. This does not approve a change. Every receipt value must exactly match Foliora's stored operation.", "inputSchema": { "additionalProperties": false, "properties": { "changeSetId": { "format": "uuid", "type": "string" }, "expectedHash": { "pattern": "^[0-9a-f]{64}$", "type": "string" }, "idempotencyKey": { "maxLength": 128, "minLength": 8, "type": "string" }, "receipt": { "additionalProperties": false, "properties": { "agent": { "type": "object" }, "appliedAt": { "format": "date-time", "type": "string" }, "operationReceipts": { "items": { "type": "object" }, "minItems": 1, "type": "array" }, "productionUrl": { "format": "uri", "type": "string" } }, "required": [ "appliedAt", "agent", "operationReceipts" ], "type": "object" } }, "required": [ "changeSetId", "expectedHash", "idempotencyKey", "receipt" ], "type": "object" }, "name": "report_publication", "outputSchema": { "additionalProperties": false, "properties": { "created": { "type": "boolean" }, "executionId": { "type": "string" }, "nextAction": { "enum": [ "none" ], "type": "string" }, "receiptId": { "type": "string" }, "verificationQueued": { "type": "boolean" }, "verificationReady": { "type": "boolean" }, "verificationReason": { "type": [ "string", "null" ] }, "verificationRunId": { "type": [ "string", "null" ] } }, "required": [ "receiptId", "executionId", "created", "verificationReady", "verificationQueued", "nextAction" ], "type": "object" } } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:84a82604d25c1f06261089ae44b8257fd5af6e7b8e9658d1e856626d068d3b87 | sha256sum