pSEO Engine

Programmatic SEO as callable tools: research, generate, audit and publish landing pages.

我該用這個嗎

品質與安全性

B
說明品質
98%
結構描述完整度
93%
命名品質
80%
汙染風險
60%
權限相符程度
100%
協定合規性
100%

發現項目(4)

  • HIGHTool poisoning patterns detected
  • MEDIUMTool 'seo_audit_start' description contains placeholder text在 seo_audit_start 中
  • MEDIUMTool description contains suspicious base64-like encoded string在 seo_job_status 中
  • INFOTool description contains placeholder or incomplete text在 seo_audit_start 中

根據工具定義與協定合規性的自動化分析。

上下文成本

~4,077Token(工具定義)
~3.5 KB典型回應大小
顯著的注意力影響(128k 上下文的 3.19%)

這是每次將伺服器的工具載入模型上下文時所消耗的約略 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
}

建議的提示詞

search_research
Search for information about [topic] using pSEO Engine
預期的工具: seo_research_start
find_specific
Find [specific item] using pSEO Engine
預期的工具: seo_research_start
retrieve_data
Get details about [item] from pSEO Engine
預期的工具: seo_project_get
fetch_info
Fetch [information type] using pSEO Engine
預期的工具: seo_project_get
list_items
List all [items] available in pSEO Engine
預期的工具: seo_project_list

社群

為此伺服器評分

證據

近期觀測

已驗證未記錄版本10 個工具
已驗證未記錄版本10 個工具