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

Server definition

Hash
sha256:a33f50177c7921b3abe9d4b6ece164dbfd4e501cb9e115194a62dcc117e2cf1c
What it is
What a remote MCP server returned when asked what it offers: 10 tools

The blob, as servednamed by its sha256

{ "instructions": "Programmatic SEO engine. Call seo_project_list first to obtain a projectId — every other tool requires one and ids cannot be guessed. If that list is empty, call seo_project_create (free) rather than stopping. Connect an AI provider key per project with seo_project_connect_ai (also free) — generation and research run on the caller's own provider account. Tools whose description says ASYNCHRONOUS return a jobId immediately and do the work in the background: poll seo_job_status until COMPLETED rather than calling the start tool again. Each call is metered against your key's prepaid balance; a 402 means the balance is exhausted and retrying will not help. Full quickstart: https://pseo.quantumcx.net/agent-quickstart", "tools": [ { "description": "ASYNCHRONOUS. Scans all generated pages for broken text, unfilled placeholders, truncated copy and missing images, recording findings per page. Returns a jobId; poll seo_job_status. This only REPORTS problems — it does not fix them. Costs 30c per call.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "projectId": { "description": "The project id, exactly as returned by seo_project_list (a cuid such as 'cmtjyi1q20000l204octn48ai'). Not the slug, not the display name. If you do not have one, call seo_project_list first.", "minLength": 1, "type": "string" } }, "required": [ "projectId" ], "type": "object" }, "name": "seo_audit_start", "outputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "jobId": { "description": "Poll seo_job_status.", "type": "string" }, "nextStep": { "type": "string" }, "projectId": { "type": "string" } }, "required": [ "jobId", "projectId", "nextStep" ], "type": "object" } }, { "description": "ASYNCHRONOUS. Starts the content-generation queue over every PENDING row in the project. It also spends real AI budget per generated page. Requires the project to be configured (check readyToGenerate via seo_project_get first). Returns a jobId immediately; poll seo_job_status. Generated pages land in GENERATED status and are NOT live until approved and published. Costs 75c per call.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "projectId": { "description": "The project id, exactly as returned by seo_project_list (a cuid such as 'cmtjyi1q20000l204octn48ai'). Not the slug, not the display name. If you do not have one, call seo_project_list first.", "minLength": 1, "type": "string" } }, "required": [ "projectId" ], "type": "object" }, "name": "seo_content_generate", "outputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "jobId": { "description": "Poll seo_job_status until COMPLETED.", "type": "string" }, "nextStep": { "type": "string" }, "projectId": { "type": "string" }, "total": { "description": "Rows queued for generation.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" } }, "required": [ "projectId", "nextStep" ], "type": "object" } }, { "description": "Returns the most recent background job for a project: type, status (QUEUED/RUNNING/COMPLETED/FAILED/CANCELLED), progress counters and the last log line. Poll this every few seconds after any tool that starts a job. Do NOT re-call the start tool while status is RUNNING; it will be refused. FREE — this call costs nothing.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "projectId": { "description": "The project id, exactly as returned by seo_project_list (a cuid such as 'cmtjyi1q20000l204octn48ai'). Not the slug, not the display name. If you do not have one, call seo_project_list first.", "minLength": 1, "type": "string" } }, "required": [ "projectId" ], "type": "object" }, "name": "seo_job_status", "outputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "job": { "anyOf": [ { "additionalProperties": false, "properties": { "completed": { "anyOf": [ { "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, { "type": "null" } ] }, "failed": { "anyOf": [ { "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, { "type": "null" } ] }, "id": { "type": "string" }, "lastLog": { "type": [ "string", "null" ] }, "status": { "type": "string" }, "total": { "anyOf": [ { "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, { "type": "null" } ] }, "type": { "type": "string" } }, "required": [ "id", "type", "status", "total", "completed", "failed", "lastLog" ], "type": "object" }, { "type": "null" } ], "description": "Null when no job has ever run for this project." }, "note": { "type": "string" }, "projectId": { "type": "string" }, "stillRunning": { "description": "Keep polling while true.", "type": "boolean" } }, "required": [ "projectId", "job" ], "type": "object" } }, { "description": "Stores the AI provider key this project's generation, audits and research run on — BYOK: the tokens bill YOUR provider account, not ours. Recommended: a Google Gemini API key (aistudio.google.com/apikey); its free tier works with no card. Optionally stores a Perplexity API key to enable citation-bearing AI visibility checks. Keys are stored encrypted and can never be read back — only replaced or cleared. FREE — this call costs nothing.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "aiApiKey": { "description": "The AI provider key to store (replaces any stored one). Omit to leave unchanged.", "type": "string" }, "aiBaseUrl": { "description": "Optional OpenAI-compatible base URL; defaults to Google's Gemini endpoint.", "type": "string" }, "aiModel": { "description": "Optional model id; defaults to gemini-2.5-flash on the Gemini endpoint.", "type": "string" }, "clearAiKey": { "description": "Pass true to REMOVE the stored AI key — generation stops until a new one is connected.", "type": "boolean" }, "clearPerplexityKey": { "description": "Pass true to REMOVE the stored Perplexity key.", "type": "boolean" }, "perplexityApiKey": { "description": "Optional Perplexity API key for visibility checks; replaces any stored one. Omit to leave unchanged.", "type": "string" }, "projectId": { "description": "The project id, exactly as returned by seo_project_list (a cuid such as 'cmtjyi1q20000l204octn48ai'). Not the slug, not the display name. If you do not have one, call seo_project_list first.", "minLength": 1, "type": "string" } }, "required": [ "projectId" ], "type": "object" }, "name": "seo_project_connect_ai", "outputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "aiKeyConnected": { "type": "boolean" }, "note": { "type": "string" }, "perplexityKeyConnected": { "type": "boolean" }, "projectId": { "type": "string" } }, "required": [ "projectId", "aiKeyConnected", "perplexityKeyConnected", "note" ], "type": "object" } }, { "description": "Creates a new programmatic-SEO project and returns its projectId. Call this when seo_project_list comes back empty — every other tool needs a projectId and a new account has none. The project is created EMPTY: it still needs a data source and a content spec before seo_content_generate will run, so call seo_project_get afterwards and read readinessNote. FREE — this call costs nothing.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "aiApiKey": { "description": "BYOK: the AI provider key this project runs on (stored encrypted). Recommended: a Google Gemini key from aistudio.google.com/apikey — its free tier works with no card. Omit to connect later via seo_project_connect_ai.", "type": "string" }, "aiBaseUrl": { "description": "Optional OpenAI-compatible base URL for the key. Defaults to Google's Gemini endpoint. Example for OpenRouter: https://openrouter.ai/api/v1", "type": "string" }, "aiModel": { "description": "Optional model id. Defaults to gemini-2.5-flash on the Gemini endpoint.", "type": "string" }, "domain": { "description": "Optional custom domain the pages will be published on, e.g. 'example.com'. Omit to serve them under the platform's own domain.", "type": "string" }, "name": { "description": "Display name, e.g. 'Plumbers by city'. The URL slug is derived from it automatically.", "maxLength": 120, "minLength": 1, "type": "string" }, "perplexityApiKey": { "description": "Optional Perplexity API key (api.perplexity.ai) to enable citation-bearing AI visibility checks for this project. Stored encrypted.", "type": "string" }, "template": { "description": "Page template. Defaults to 'location'.", "enum": [ "location", "industry", "comparison", "all" ], "type": "string" } }, "required": [ "name" ], "type": "object" }, "name": "seo_project_create", "outputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "domain": { "type": [ "string", "null" ] }, "name": { "type": "string" }, "nextStep": { "type": "string" }, "projectId": { "description": "Pass this to every other tool.", "type": "string" }, "readyToGenerate": { "description": "Always false here — a new project has no data source yet.", "type": "boolean" }, "slug": { "type": "string" }, "template": { "type": "string" } }, "required": [ "projectId", "name", "slug", "domain", "template", "readyToGenerate", "nextStep" ], "type": "object" } }, { "description": "Returns one project's settings and whether it is configured enough to generate content (needs both a field mapping and a content spec). Use this before seo_content_generate to avoid starting a run that will immediately fail. FREE — this call costs nothing.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "projectId": { "description": "The project id, exactly as returned by seo_project_list (a cuid such as 'cmtjyi1q20000l204octn48ai'). Not the slug, not the display name. If you do not have one, call seo_project_list first.", "minLength": 1, "type": "string" } }, "required": [ "projectId" ], "type": "object" }, "name": "seo_project_get", "outputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "domain": { "type": [ "string", "null" ] }, "indexable": { "description": "False while the project is in staging mode.", "type": "boolean" }, "name": { "type": "string" }, "projectId": { "type": "string" }, "readinessNote": { "description": "Plain-language reason, whichever way readyToGenerate went.", "type": "string" }, "readyToGenerate": { "type": "boolean" }, "researchBrief": { "type": [ "string", "null" ] }, "slug": { "type": "string" }, "template": { "type": "string" } }, "required": [ "projectId", "name", "slug", "domain", "template", "indexable", "researchBrief", "readyToGenerate", "readinessNote" ], "type": "object" } }, { "description": "Lists every programmatic-SEO project this API key can act on, with id, name, slug, custom domain and page count. Call this FIRST in any session — every other tool needs a projectId from here, and ids cannot be guessed or carried over from another account. FREE — this call costs nothing.", "inputSchema": { "properties": {}, "type": "object" }, "name": "seo_project_list", "outputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "hint": { "description": "What to do next, given whether the list was empty.", "type": "string" }, "projects": { "description": "Every project this key can act on. Empty on a new account.", "items": { "additionalProperties": false, "properties": { "createdAt": { "type": "string" }, "domain": { "type": [ "string", "null" ] }, "name": { "type": "string" }, "projectId": { "type": "string" }, "slug": { "type": "string" }, "totalPages": { "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" } }, "required": [ "projectId", "name", "slug", "domain", "totalPages", "createdAt" ], "type": "object" }, "type": "array" } }, "required": [ "projects", "hint" ], "type": "object" } }, { "description": "SYNCHRONOUS. Takes approved pages live. IMPORTANT: only rows in REVIEWED status are published — GENERATED drafts are deliberately skipped, because approval is a human gate in this product. The response reports how many were skipped and why; if publishedCount is 0 and skippedNeedsReview is high, the pages need approving in the dashboard first. Costs 15c per call.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "projectId": { "description": "The project id, exactly as returned by seo_project_list (a cuid such as 'cmtjyi1q20000l204octn48ai'). Not the slug, not the display name. If you do not have one, call seo_project_list first.", "minLength": 1, "type": "string" } }, "required": [ "projectId" ], "type": "object" }, "name": "seo_publish", "outputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "note": { "type": "string" }, "projectId": { "type": "string" }, "publishedCount": { "description": "Rows taken live by this call.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, "skippedNeedsReview": { "description": "GENERATED drafts skipped: approval is a human gate.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" } }, "required": [ "projectId" ], "type": "object" } }, { "description": "ASYNCHRONOUS. Starts a keyword-research run that mines and qualifies keywords into PENDING rows. It spends real AI budget, so call it once and then poll seo_job_status until status is COMPLETED. Returns immediately with a jobId — the keywords do NOT exist yet when this returns. Fails if a research run is already in progress. HUMAN trial accounts get one research run free; a second run returns code card_required — only a human on the account can start a plan, so stop and report instead of retrying. Costs 750c per call.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "brief": { "description": "One or two sentences describing the niche and the customer, e.g. 'Plumbing lead generation for independent plumbers across UK cities'. Must be at least 10 characters — a bare keyword is not enough context to mine from.", "minLength": 10, "type": "string" }, "projectId": { "description": "The project id, exactly as returned by seo_project_list (a cuid such as 'cmtjyi1q20000l204octn48ai'). Not the slug, not the display name. If you do not have one, call seo_project_list first.", "minLength": 1, "type": "string" }, "targetCount": { "default": 200, "description": "How many keywords to mine, 10-2000. Higher costs more AI time. Start around 200 unless told otherwise.", "maximum": 2000, "minimum": 10, "type": "integer" } }, "required": [ "projectId", "brief" ], "type": "object" }, "name": "seo_research_start", "outputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "jobId": { "description": "Poll seo_job_status; the keywords do not exist yet.", "type": "string" }, "nextStep": { "type": "string" }, "projectId": { "type": "string" }, "started": { "type": "boolean" } }, "required": [ "started", "jobId", "projectId", "nextStep" ], "type": "object" } }, { "description": "Returns a page of rows (individual generated pages) with slug, target keyword and status. Statuses are PENDING (no content yet), GENERATING, GENERATED (draft), REVIEWED (approved), PUBLISHED (live), FAILED, FLAGGED_DUPLICATE. Content bodies are NOT included — this is a listing, not an export. Use sort:'risk' to get the review queue ordered by risk score (duplicates and pages with QA findings first) so a human reviews the riskiest pages before bulk-approving the safe ones. Costs 3c per call.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "limit": { "default": 50, "description": "How many rows to return, 1-200. Defaults to 50. Values above 200 are rejected — page through instead of asking for everything.", "maximum": 200, "minimum": 1, "type": "integer" }, "projectId": { "description": "The project id, exactly as returned by seo_project_list (a cuid such as 'cmtjyi1q20000l204octn48ai'). Not the slug, not the display name. If you do not have one, call seo_project_list first.", "minLength": 1, "type": "string" }, "sort": { "description": "'risk' returns pages ordered by review risk (highest first), each with a score, band and human-readable reasons. Omit for creation order.", "enum": [ "createdAt", "risk" ], "type": "string" }, "status": { "description": "Optional exact status filter. Omit for all statuses. Must be one of the listed values, uppercase.", "enum": [ "PENDING", "GENERATING", "GENERATED", "REVIEWED", "PUBLISHED", "FAILED", "FLAGGED_DUPLICATE" ], "type": "string" } }, "required": [ "projectId" ], "type": "object" }, "name": "seo_rows_list", "outputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "limit": { "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, "projectId": { "type": "string" }, "returned": { "description": "How many rows came back; compare with limit to detect more pages.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, "rows": { "items": { "additionalProperties": false, "properties": { "id": { "type": "string" }, "keyword": { "type": [ "string", "null" ] }, "risk": { "additionalProperties": false, "description": "Present only when sort:'risk'.", "properties": { "band": { "enum": [ "high", "medium", "low" ], "type": "string" }, "reasons": { "items": { "type": "string" }, "type": "array" }, "score": { "maximum": 100, "minimum": 0, "type": "integer" } }, "required": [ "score", "band", "reasons" ], "type": "object" }, "slug": { "type": [ "string", "null" ] }, "status": { "type": "string" } }, "required": [ "id", "slug", "keyword", "status" ], "type": "object" }, "type": "array" } }, "required": [ "projectId", "returned", "limit", "rows" ], "type": "object" } } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:a33f50177c7921b3abe9d4b6ece164dbfd4e501cb9e115194a62dcc117e2cf1c | sha256sum