MCP server
Pro Vantage SEO Pro includes an MCP server. AI agents such as Claude Code can use it to read and change the SEO of your site. This page tells you how to create a token, connect a client, and what each of the 20 tools does.
Overview
- The plugin serves the MCP endpoint itself. You do not install a separate server.
- The transport is Streamable HTTP in stateless JSON mode. Each request is one HTTP
POSTwith one JSON-RPC message, and the answer is one JSON response. The server does not use server-sent events. - The server supports MCP protocol version
2025-06-18. It does not accept JSON-RPC batches. - The server name is
vantage-seo. - The endpoint needs an active Pro license. Without one, every request gets HTTP 403 with a message that tells you to activate or renew the license.
Instatic has its own MCP server for content and page editing, at /_instatic/mcp. The Vantage SEO server is separate. It covers SEO data only, and it uses its own tokens.
Endpoint
https://your-site.example/admin/api/cms/plugins/monkeywebs.seo/runtime/mcpThe Connections tab of SEO Settings shows the full endpoint URL for your site. The URL is absolute only after you save a site URL. The endpoint accepts POST only. Other methods get HTTP 405.
Create a token
Each client needs a bearer token.
- Open SEO Settings, Connections tab.
- Under New token, enter a label, for example
claude-code-laptop. A label can have up to 64 characters. - Select the scope: read or read-write.
- Select the expiry: 30 days, 90 days, 365 days or never. The default is 90 days.
- Click Create token. Copy the token at once with Copy token. The token starts with
vseo_. The plugin shows it one time only.
Your browser creates the token and computes its SHA-256 hash. Only the hash goes to the server. The plugin cannot show you the token again. If you lose it, revoke it and create a new one.
Scopes
| Scope | What the client can do |
|---|---|
| read | Call the 10 read tools. The write tools do not appear in the tool list. |
| read-write | Call all 20 tools. |
Write tools use the same validation as the admin screens. The MCP server never returns secrets, such as API keys or Search Console credentials.
Revoke a token
On the Connections tab, under Tokens, click the revoke button next to the token and confirm. The token stops working at once. The plugin removes revoked and expired tokens from the list after 30 days.
Limits and errors
| HTTP status | Cause |
|---|---|
| 401 | The token is missing, wrong, revoked or expired. |
| 403 | The Pro license is not active. |
| 405 | The request is not a POST. |
| 406 | The Accept header does not allow application/json. |
| 413 | The request body is too large. |
| 429 | The token made more than 60 calls in one minute. |
The server reads the token only from the Authorization header. It never reads a token from the URL.
Audit log
The plugin records every call in an audit log. Each entry has the time, the tool or method name, the token label, a short hash of the arguments and the result: ok, error or denied. The log does not store the arguments. The Connections tab shows recent activity. The plugin keeps the newest 500 entries.
Connect Claude Code
Run this command. Replace the URL with your endpoint and <TOKEN> with your token. The Connections tab shows the same command with your URL.
claude mcp add --transport http vantage-seo https://your-site.example/admin/api/cms/plugins/monkeywebs.seo/runtime/mcp --header "Authorization: Bearer <TOKEN>"Other MCP clients use the same URL and the same Authorization header.
Test the endpoint with curl
curl -X POST https://your-site.example/admin/api/cms/plugins/monkeywebs.seo/runtime/mcp \
-H "Authorization: Bearer <TOKEN>" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'The server supports the methods initialize, ping, tools/list, tools/call, resources/list and resources/read.
Resources
| URI | Content |
|---|---|
seo://config | The stored SEO settings as JSON. These settings hold no secrets. |
seo://audit-report | The latest site audit report. |
Tools
All tool names start with seo_. "Writes" means the tool needs a read-write token. The table input is a table slug, for example pages. The entryId input is the id of a row in that table.
| Tool | What it does | Main inputs | Writes? |
|---|---|---|---|
seo_get_entry_meta | Returns the final SEO values of one entry (override plus site and table defaults) and the stored override. | table, entryId | No |
seo_set_entry_meta | Replaces the stored SEO override of one entry: title, description, canonical, robots, Open Graph fields, Twitter card, focus keywords, schema type, custom JSON-LD. | table, entryId, meta | Yes |
seo_list_entries_seo_status | Lists the entries of a table with their SEO status: override present, missing description, noindex. | table, optional filter (missing_description, noindex, no_override), limit up to 100 | No |
seo_analyze_entry | Runs the content analysis on the stored content of an entry and returns the checks and the score. | table, entryId, optional keyword | No |
seo_get_site_issues | Returns a site-wide report: pages without a description, noindex overrides, image findings and 404 totals. | None | No |
seo_regenerate_sitemap | Clears the cached sitemap and builds it again from the page list. Returns the URL count. | None | Yes |
seo_bulk_set_meta | Queues a background job that writes SEO overrides for up to 200 entries. The plugin checks the whole batch first and rejects it if one entry is not valid. Returns a job id. | table, entries (each with entryId and meta) | Yes |
seo_get_job_status | Returns the state, progress, result and error of a background job. | jobId | No |
seo_list_redirects | Lists all stored redirect rules. | None | No |
seo_get_404_log | Returns the 404 paths with their hit counts, highest first. | Optional limit | No |
seo_create_redirect | Creates a redirect rule: 301 or 302 to a target, or 410 gone. The source can be an exact path or a regular expression. | fromPath, status, toPath (not for 410), optional isRegex, note, enabled | Yes |
seo_update_redirect | Changes some fields of a redirect rule. | key, then any of fromPath, toPath, status, isRegex, note, enabled | Yes |
seo_delete_redirect | Deletes a redirect rule. | key | Yes |
seo_list_schema_templates | Lists the stored schema templates. | None | No |
seo_set_schema_template | Creates a schema template (no key) or replaces one (with key). Type custom needs rawJson. | name, targetTable, schemaType, optional key, fields, rawJson, enabled | Yes |
seo_delete_schema_template | Deletes a schema template. | key | Yes |
seo_set_entry_schema | Sets the page type and the custom JSON-LD of one entry. null clears a field. | table, entry, schemaType and/or customSchemaJson | Yes |
seo_get_audit_report | Returns the latest site audit report: a score from 0 to 100 and the findings. Returns null before the first audit. | None | No |
seo_run_audit | Runs the site audit now, stores the report and returns it. | None | Yes |
seo_get_gsc_summary | Returns the cached Search Console data for each page (clicks, impressions, CTR, position over 28 days) and the sync status. It does not call Google. | Optional limit up to 500 | No |
Things to know about the tools
- Publish after a change. The plugin writes tags into HTML at publish time. A tool that changes meta, schema or templates does not change pages that Instatic already published. Publish the pages to apply the change. The Vantage SEO server has no publish tool.
- Redirects need your proxy. Instatic has no redirect feature for plugins. A stored rule changes nothing on the server until you install an export on your reverse proxy. With Pro, the 404 page also forwards visitors with a small script. See Redirects.
- Background jobs are slow on purpose. A bulk job runs in steps of 10 entries on the 15-minute maintenance task. Poll
seo_get_job_status. At most 5 bulk jobs can wait or run at the same time. - The audit reads the last publish. The audit does not crawl your live site. It uses facts that the plugin recorded when each page was published. Publish first, then run the audit.
- Per-entry values apply to regular pages. Entries of other tables render through a template page, and the plugin skips per-entry values there.