pSEO Engine
Programmatic SEO as callable tools: research, generate, audit and publish landing pages.
我該用這個嗎
品質與安全性
發現項目(4)
- HIGH
- MEDIUM在 seo_audit_start 中
- MEDIUM在 seo_job_status 中
- INFO在 seo_audit_start 中
根據工具定義與協定合規性的自動化分析。
上下文成本
這是每次將伺服器的工具載入模型上下文時所消耗的約略 token 數量。數量越高,可用於其他工作的注意力就越少。
安裝
一鍵安裝
將以下內容加入你的 `claude_desktop_config.json` 檔案:
{
"mcpServers": {
"pseo-engine": {
"url": "https://pseo.quantumcx.net/api/agent/mcp"
}
}
}遠端端點
https://pseo.quantumcx.net/api/agent/mcpstreamable-http它能做什麼
工具清單
工具(10)
🟢seo_project_list
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.
輸入結構描述
{
"type": "object",
"properties": {}
}輸出結構描述
{
"type": "object",
"properties": {
"projects": {
"type": "array",
"items": {
"type": "object",
"properties": {
"projectId": {
"type": "string"
},
"name": {
"type": "string"
},
"slug": {
"type": "string"
},
"domain": {
"type": [
"string",
"null"
]
},
"totalPages": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"createdAt": {
"type": "string"
}
},
"required": [
"projectId",
"name",
"slug",
"domain",
"totalPages",
"createdAt"
],
"additionalProperties": false
},
"description": "Every project this key can act on. Empty on a new account."
},
"hint": {
"type": "string",
"description": "What to do next, given whether the list was empty."
}
},
"required": [
"projects",
"hint"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟡seo_project_create(name, domain, template, aiApiKey, aiBaseUrl, ...)
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.
輸入結構描述
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120,
"description": "Display name, e.g. 'Plumbers by city'. The URL slug is derived from it automatically."
},
"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"
},
"template": {
"description": "Page template. Defaults to 'location'.",
"type": "string",
"enum": [
"location",
"industry",
"comparison",
"all"
]
},
"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"
},
"perplexityApiKey": {
"description": "Optional Perplexity API key (api.perplexity.ai) to enable citation-bearing AI visibility checks for this project. Stored encrypted.",
"type": "string"
}
},
"required": [
"name"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}輸出結構描述
{
"type": "object",
"properties": {
"projectId": {
"type": "string",
"description": "Pass this to every other tool."
},
"name": {
"type": "string"
},
"slug": {
"type": "string"
},
"domain": {
"type": [
"string",
"null"
]
},
"template": {
"type": "string"
},
"readyToGenerate": {
"type": "boolean",
"description": "Always false here — a new project has no data source yet."
},
"nextStep": {
"type": "string"
}
},
"required": [
"projectId",
"name",
"slug",
"domain",
"template",
"readyToGenerate",
"nextStep"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢seo_project_connect_ai(projectId, aiApiKey, aiBaseUrl, aiModel, perplexityApiKey, ...)
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.
輸入結構描述
{
"type": "object",
"properties": {
"projectId": {
"type": "string",
"minLength": 1,
"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."
},
"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"
},
"perplexityApiKey": {
"description": "Optional Perplexity API key for visibility checks; replaces any stored one. Omit to leave unchanged.",
"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"
}
},
"required": [
"projectId"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}輸出結構描述
{
"type": "object",
"properties": {
"projectId": {
"type": "string"
},
"aiKeyConnected": {
"type": "boolean"
},
"perplexityKeyConnected": {
"type": "boolean"
},
"note": {
"type": "string"
}
},
"required": [
"projectId",
"aiKeyConnected",
"perplexityKeyConnected",
"note"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢seo_project_get(projectId)
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.
輸入結構描述
{
"type": "object",
"properties": {
"projectId": {
"type": "string",
"minLength": 1,
"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."
}
},
"required": [
"projectId"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}輸出結構描述
{
"type": "object",
"properties": {
"projectId": {
"type": "string"
},
"name": {
"type": "string"
},
"slug": {
"type": "string"
},
"domain": {
"type": [
"string",
"null"
]
},
"template": {
"type": "string"
},
"indexable": {
"type": "boolean",
"description": "False while the project is in staging mode."
},
"researchBrief": {
"type": [
"string",
"null"
]
},
"readyToGenerate": {
"type": "boolean"
},
"readinessNote": {
"type": "string",
"description": "Plain-language reason, whichever way readyToGenerate went."
}
},
"required": [
"projectId",
"name",
"slug",
"domain",
"template",
"indexable",
"researchBrief",
"readyToGenerate",
"readinessNote"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢seo_rows_list(projectId, status, sort, limit)
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.
輸入結構描述
{
"type": "object",
"properties": {
"projectId": {
"type": "string",
"minLength": 1,
"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."
},
"status": {
"description": "Optional exact status filter. Omit for all statuses. Must be one of the listed values, uppercase.",
"type": "string",
"enum": [
"PENDING",
"GENERATING",
"GENERATED",
"REVIEWED",
"PUBLISHED",
"FAILED",
"FLAGGED_DUPLICATE"
]
},
"sort": {
"description": "'risk' returns pages ordered by review risk (highest first), each with a score, band and human-readable reasons. Omit for creation order.",
"type": "string",
"enum": [
"createdAt",
"risk"
]
},
"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.",
"type": "integer",
"minimum": 1,
"maximum": 200
}
},
"required": [
"projectId"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}輸出結構描述
{
"type": "object",
"properties": {
"projectId": {
"type": "string"
},
"returned": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "How many rows came back; compare with limit to detect more pages."
},
"limit": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"rows": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"slug": {
"type": [
"string",
"null"
]
},
"keyword": {
"type": [
"string",
"null"
]
},
"status": {
"type": "string"
},
"risk": {
"description": "Present only when sort:'risk'.",
"type": "object",
"properties": {
"score": {
"type": "integer",
"minimum": 0,
"maximum": 100
},
"band": {
"type": "string",
"enum": [
"high",
"medium",
"low"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"score",
"band",
"reasons"
],
"additionalProperties": false
}
},
"required": [
"id",
"slug",
"keyword",
"status"
],
"additionalProperties": false
}
}
},
"required": [
"projectId",
"returned",
"limit",
"rows"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢seo_job_status(projectId)
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.
輸入結構描述
{
"type": "object",
"properties": {
"projectId": {
"type": "string",
"minLength": 1,
"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."
}
},
"required": [
"projectId"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}輸出結構描述
{
"type": "object",
"properties": {
"projectId": {
"type": "string"
},
"job": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"type": {
"type": "string"
},
"status": {
"type": "string"
},
"total": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"completed": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"failed": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"lastLog": {
"type": [
"string",
"null"
]
}
},
"required": [
"id",
"type",
"status",
"total",
"completed",
"failed",
"lastLog"
],
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Null when no job has ever run for this project."
},
"stillRunning": {
"description": "Keep polling while true.",
"type": "boolean"
},
"note": {
"type": "string"
}
},
"required": [
"projectId",
"job"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢seo_research_start(projectId, brief, targetCount)
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.
輸入結構描述
{
"type": "object",
"properties": {
"projectId": {
"type": "string",
"minLength": 1,
"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."
},
"brief": {
"type": "string",
"minLength": 10,
"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."
},
"targetCount": {
"default": 200,
"description": "How many keywords to mine, 10-2000. Higher costs more AI time. Start around 200 unless told otherwise.",
"type": "integer",
"minimum": 10,
"maximum": 2000
}
},
"required": [
"projectId",
"brief"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}輸出結構描述
{
"type": "object",
"properties": {
"started": {
"type": "boolean"
},
"jobId": {
"type": "string",
"description": "Poll seo_job_status; the keywords do not exist yet."
},
"projectId": {
"type": "string"
},
"nextStep": {
"type": "string"
}
},
"required": [
"started",
"jobId",
"projectId",
"nextStep"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢seo_content_generate(projectId)
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.
輸入結構描述
{
"type": "object",
"properties": {
"projectId": {
"type": "string",
"minLength": 1,
"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."
}
},
"required": [
"projectId"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}輸出結構描述
{
"type": "object",
"properties": {
"jobId": {
"description": "Poll seo_job_status until COMPLETED.",
"type": "string"
},
"total": {
"description": "Rows queued for generation.",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"projectId": {
"type": "string"
},
"nextStep": {
"type": "string"
}
},
"required": [
"projectId",
"nextStep"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}⚪seo_audit_start(projectId)
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.
輸入結構描述
{
"type": "object",
"properties": {
"projectId": {
"type": "string",
"minLength": 1,
"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."
}
},
"required": [
"projectId"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}輸出結構描述
{
"type": "object",
"properties": {
"jobId": {
"type": "string",
"description": "Poll seo_job_status."
},
"projectId": {
"type": "string"
},
"nextStep": {
"type": "string"
}
},
"required": [
"jobId",
"projectId",
"nextStep"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟡seo_publish(projectId)
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.
輸入結構描述
{
"type": "object",
"properties": {
"projectId": {
"type": "string",
"minLength": 1,
"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."
}
},
"required": [
"projectId"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}輸出結構描述
{
"type": "object",
"properties": {
"projectId": {
"type": "string"
},
"publishedCount": {
"description": "Rows taken live by this call.",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"skippedNeedsReview": {
"description": "GENERATED drafts skipped: approval is a human gate.",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"note": {
"type": "string"
}
},
"required": [
"projectId"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}建議的提示詞
seo_research_startseo_research_startseo_project_getseo_project_getseo_project_list社群
證據