pSEO Engine
Measured conclusion: Deep-tested. L2 outcome: tools_ok.
Programmatic SEO as callable tools: research, generate, audit and publish landing pages.
| Author | net.quantumcx |
|---|---|
| Access | remote |
| Publisher key required | No |
| Measured state | Deep-tested |
| L1 liveness | alive |
| L1 latency | 1878 ms |
| Last measured | 2026-10-24 |
Add to your agent
Copy this into your MCP client config:
{
"mcpServers": {
"pSEO Engine": {
"url": "https://pseo.quantumcx.net/api/agent/mcp",
"transport": "streamable-http"
}
}
}
Measured tools (10)
seo_project_listread-onlyLists 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.
Hints: read-only yes · destructive no · idempotent yes · open-world no
seo_project_createCreates 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.
Parameters:
name(required) — string — Display name, e.g. 'Plumbers by city'. The URL slug is derived from it automatically.domain— string — Optional custom domain the pages will be published on, e.g. 'example.com'. Omit to serve them under the platform's own domain.aiModel— string — Optional model id. Defaults to gemini-2.5-flash on the Gemini endpoint.aiApiKey— string — 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.template— string — Page template. Defaults to 'location'.aiBaseUrl— string — Optional OpenAI-compatible base URL for the key. Defaults to Google's Gemini endpoint. Example for OpenRouter: https://openrouter.ai/api/v1perplexityApiKey— string — Optional Perplexity API key (api.perplexity.ai) to enable citation-bearing AI visibility checks for this project. Stored encrypted.
Hints: read-only no · destructive no · idempotent no · open-world no
seo_project_connect_aiStores 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.
Parameters:
projectId(required) — string — 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.aiModel— string — Optional model id; defaults to gemini-2.5-flash on the Gemini endpoint.aiApiKey— string — The AI provider key to store (replaces any stored one). Omit to leave unchanged.aiBaseUrl— string — Optional OpenAI-compatible base URL; defaults to Google's Gemini endpoint.clearAiKey— boolean — Pass true to REMOVE the stored AI key — generation stops until a new one is connected.perplexityApiKey— string — Optional Perplexity API key for visibility checks; replaces any stored one. Omit to leave unchanged.clearPerplexityKey— boolean — Pass true to REMOVE the stored Perplexity key.
Hints: read-only no · destructive no · idempotent yes · open-world no
seo_project_getread-onlyReturns 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.
Parameters:
projectId(required) — string — 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.
Hints: read-only yes · destructive no · idempotent yes · open-world no
seo_rows_listread-onlyReturns 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.
Parameters:
projectId(required) — string — 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.sort— string — 'risk' returns pages ordered by review risk (highest first), each with a score, band and human-readable reasons. Omit for creation order.limit— integer — How many rows to return, 1-200. Defaults to 50. Values above 200 are rejected — page through instead of asking for everything.status— string — Optional exact status filter. Omit for all statuses. Must be one of the listed values, uppercase.
Hints: read-only yes · destructive no · idempotent yes · open-world no
seo_job_statusread-onlyReturns 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.
Parameters:
projectId(required) — string — 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.
Hints: read-only yes · destructive no · idempotent yes · open-world no
seo_research_startASYNCHRONOUS. 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.
Parameters:
projectId(required) — string — 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.brief(required) — string — 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.targetCount— integer — How many keywords to mine, 10-2000. Higher costs more AI time. Start around 200 unless told otherwise.
Hints: read-only no · destructive no · idempotent no · open-world yes
seo_content_generateASYNCHRONOUS. 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.
Parameters:
projectId(required) — string — 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.
Hints: read-only no · destructive no · idempotent no · open-world yes
seo_audit_startASYNCHRONOUS. 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.
Parameters:
projectId(required) — string — 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.
Hints: read-only no · destructive no · idempotent no · open-world yes
seo_publishSYNCHRONOUS. 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.
Parameters:
projectId(required) — string — 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.
Hints: read-only no · destructive no · idempotent yes · open-world yes
Measured by MCPYP probing. Untested fields are omitted, never estimated. Listing is always free; MCPYP never proxies calls or stores user tokens.