
AltoRank
co.altorank由 altorank.co 发布官方发布者v0.3.0更新于 Nov 2, 2026
Readiness audits, Search Console, keyword research, and SEO drafts into a review queue.
概览
AltoRank 的托管 SEO MCP 服务器,让助手进行关键词研究、站点就绪度审计、Search Console 分析,并把文章草稿送入人工审核队列。
- 可以做什么
- 研究关键词并分析搜索结果页,配置 DataForSEO 后可获取搜索量与排名数据
- 通过爬取、PageSpeed 和就绪度检查审计域名的准备情况
- 读取 Google Search Console 与 Bing Webmaster Tools 的搜索分析数据
- 按研究、起草、评分、事实核查流程生成文章,并用查找替换方式修改草稿
- 调整内容计划中的条目,并对已获人工批准的文章重试失败的发布
- 适用场景
- 适合让助手承担 SEO 基础工作——关键词构思、站点审计、搜索表现查询、初稿撰写——同时由人保留审批与发布权。适合已在用 AltoRank 或愿意自行部署的团队。
- 运行要求
- 使用托管应用的 MCP 远程 Streamable HTTP 端点,或自建实例的地址。认证方式为 OAuth(仅所有者或管理员可授权,写权限需主动开启)或在后台创建的 bearer API 密钥。自建还需 Node 22+、Supabase 项目、Anthropic API 密钥、Resend 凭据等多个环境变量。
安装
在 SourceWeft 中
- 打开 控制台中的 AltoRank,将其添加到工作区。
- 连接 所需的 凭据。它们会被私密存储,绝不会在公开页面上展示。
- 为需要使用其工具的对话启用该服务。
Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。
交给智能体安装
把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。
阅读 https://sourceweft.com/mcp/co.altorank%2Faltorank/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。其他 MCP 客户端
把它添加到你客户端的 mcpServers 配置中。 客户端会在首次连接时完成 OAuth 登录。
{
"mcpServers": {
"altorank": {
"type": "http",
"url": "https://app.altorank.co/api/mcp"
}
}
}README
AltoRank: open-source, self-hosted AI SEO content writer (Outrank alternative)
An open-source alternative to Outrank and Jasper. AltoRank researches a
keyword, writes the article, scores it and fact-checks it: a figure that cites
a page is looked for on that page, and one with no source is flagged for the
reviewer. Every draft can be copied as Markdown (front matter included) or
HTML, or downloaded as a .md file, for you to paste wherever you publish.
Approve it, paste it, then Mark as published records the live URL, and the
article is tracked from there: indexing and rank.
AltoRank never publishes to your site without an approval recorded under a named person. Approve each draft by hand, or set a rule that approves drafts after a hold unless you hold them (the rule publishes through a CMS connection, which is built but not yet verified end to end; see Status). Agents can research and draft through the MCP server and the agent API. Neither can approve, and neither can publish anything a person has not already approved (the one publish-side call retries a failed publish of an approved article).
Self-host it free under AGPL-3.0, or use the hosted app at app.altorank.co.
Open source, the whole product. No feature-gated tier, no ee/ directory.
Status
The hosted app at app.altorank.co is this repository, deployed from main
(docs/deploy.md). A self-hosted install runs the same code
against your own Supabase and your own API keys. Research, drafting, scoring,
fact-checking, audits, rank tracking and Search Console / Bing sync run today;
the table below has the detail. What is not finished yet:
- No paying customers, no case studies. Nothing here has a growth figure attached to it, and that is on purpose.
- CMS publishing is built but not yet verified end to end. The thirteen
adapters are in
apps/web/lib/cms/and the connection form covers all of them, but none has been watched publishing to a live site yet, so the platform tiles on/connectask you to request an integration instead of offering Connect. Every draft can be copied as Markdown or HTML today. Details under What works today. - AI visibility tracking is built but not switched on. The probe, the
weekly cron and the
/geopage exist, but nothing in the app turns tracking on for a workspace or adds the prompts it measures, so the sidebar marks it "soon" (apps/web/lib/constants.ts). - The CLI is publishable, not yet on npm.
packages/altorank-clibundlesapps/web/scripts/cli.tsinto analtorankbinary (npx altorank auth whoamionce it is published); until then,npm run clifromapps/webdrives the same agent API from a checkout.skills/altorank/SKILL.mdis the skill file a coding agent reads, and it does install withnpx; see below.
Whether you want to read how it works, run it yourself or send a patch, everything is here.
The publishing decision
One gate, two ways through it. lib/publishing/core.ts refuses any article
that is not approved or scheduled with approved_by set. Only the server
writes those columns: a signed-in user's own database client cannot make an
article approved, scheduled or live (migration 109), and an edit to approved
text sends it back to review. What can write an approval:
- A person, from the editor (
approveArticle), recorded asapproved_by. The button checks for an active plan and refuses a bare, unsourced figure. - A rule a named member of the account set (
auto_approve, migration 079): the publish cron runs stricter checks than the Approve button - active plan, somewhere to publish, no unsourced figure, no named reviewer still to sign off, no failing audit item, SEO score at or above the floor - after a hold window (default 24h) during which the drafted email carries a Hold link.approved_byis whoever turned the rule on;approval_kindsaysauto. Held drafts carry the reason on their own row. Seelib/publishing/auto-approve.ts.
live is written after an approved publish, by Mark as published on an
approved article, and by one thing that is not a publish: the nightly
found-on-site check (lib/found-on-site/detect.ts) marks a draft live when
its text is already on the customer's own site. That records something done
outside AltoRank, sends nothing to a CMS, carries no approval, and can be
undone from the editor.
What cannot write an approval: an agent. No MCP tool or agent API call
approves an article or publishes a draft - not disabled, absent. The one
publish-side call, altorank_retry_publish (POST /articles/{id}/retry-publish), re-runs a failed publish of an article a
person already approved, and is refused for anything else. The MCP tools are
all registered in apps/web/lib/mcp/server.ts, and its server instructions
say so to the agent.
Competing tools ship the words "you stay in control" as copy. The difference
is checkable here: every live row is an approved article (by click or by
rule) or one found already published on the customer's own site.
What works today
Publishing destinations (apps/web/lib/cms/adapter.ts) — thirteen adapters
covering ten CMS platforms; WordPress is reachable two ways, and git and
webhook are publishing targets rather than CMSs. Framer, Ghost, git, HubSpot, Magento,
Notion, Shopify, Webflow, webhook, Wix, WooCommerce, WordPress, and the
WordPress plugin — a second, recommended route to WordPress that installs a
plugin and takes a per-site token instead of an application password
(apps/web/lib/cms/wordpress-plugin.ts), which is why WordPress appears twice.
None of the thirteen has yet been verified end to end against a live site, so
CONNECTABLE_CMS in apps/web/lib/cms/connectable.ts is empty on purpose and
every CMS tile on /connect offers "Request integration" instead of Connect;
adding an id to that set brings that tile's Connect button back. The
connection form itself is unchanged and still covers all thirteen: the
page's "New connection" button, a draft's publish panel and
/connect?connect=<id> all open it. Without a connection, the editor copies
any draft as Markdown (front matter included) or HTML, or downloads it as a
.md file.
Install the plugin
Claude Code. From a terminal:
Or inside a Claude Code session: /plugin marketplace add AltoRank/altorank,
then /plugin install altorank@altorank.
plugins/altorank/ bundles the hosted MCP server (https://app.altorank.co/api/mcp,
OAuth, no API key to copy) with a skill written for those tools. The same folder
carries the portable plugin.json + mcp.json that ChatGPT and Codex read, and
.agents/plugins/marketplace.json lists it for them.
Install the skill
That puts skills/altorank/SKILL.md where Claude Code, Cursor, Codex, Copilot,
Windsurf, Gemini CLI, Cline and the other agents the
skills CLI supports will read it. The
skill teaches an agent to drive the agent API (/api/agent/v1): preflight the
key, check a site's readiness, list or suggest keywords, generate a draft into
a human's review queue, edit a draft by find-and-replace, move the content
plan. It never approves, deletes or publishes a draft; the API has no such
calls. Its one publish-side call retries a failed publish of an article a
person already approved.
It needs an API key, created at /settings/api-keys in the dashboard and
exported as ALTORANK_API_KEY. Self-hosted installs also set
ALTORANK_BASE_URL. skills/altorank/commands/ holds five thin slash
commands for the common calls; the skills CLI does not register slash commands,
so copy them into .claude/commands/ (Claude Code) or your agent's equivalent
if you want them.
Running it
Requires Node 22+, and a Supabase project (local via Docker, or hosted). The full deployment story, hosted and self-hosted, is in docs/deploy.md; the Cloudflare assessment is in docs/deploy-cloudflare.md.
Required before a self-hosted install works end to end:
- your Supabase URL, its anon key and its
SUPABASE_SERVICE_ROLE_KEY NEXT_PUBLIC_APP_URL, the address people open the app at. Every emailed link (signup confirmation, invites, password reset) is built from it, and the Docker build bakes it into the image, so set it beforedocker compose up --build; compose refuses to build without it.ANTHROPIC_API_KEYENCRYPTION_KEYandCRON_SECRET(openssl rand -hex 32for each).docker composerefuses to start withoutCRON_SECRET, and without it no scheduled job runs.RESEND_API_KEYandRESEND_FROM_EMAIL(a sender on a domain verified in your Resend account). Signup confirms by email, so without them nobody can create an account and nobody can reset a password.
Add DATAFORSEO_LOGIN / DATAFORSEO_PASSWORD for keyword volume and rank
tracking; without them those steps skip rather than fail. Everything else in
the example file is optional and each one disables exactly one feature. The
file says which. Product analytics (the two NEXT_PUBLIC_POSTHOG_* variables,
project token and host) are optional too: without them the browser console
says analytics are off and nothing else changes.
Other entry points:
and from apps/web:
Hosted MCP endpoint
The same tools are served at /api/mcp (Streamable HTTP) by the running app,
so an MCP client adds one URL as a connector instead of running the stdio
server: https://app.altorank.co/api/mcp on the hosted install, or your own
origin when you self-host. Authentication is a bearer token, either an API key
from /settings/api-keys or the token the built-in OAuth flow issues:
- discovery at
/.well-known/oauth-authorization-serverand/.well-known/oauth-protected-resource/api/mcp - dynamic client registration at
/api/oauth/register(public clients, PKCE S256 only) - consent at
/oauth/authorize, owner or admin only, write scope opt-in - token at
/api/oauth/token, authorization-code grant, no refresh token
The token a connector receives is an api_keys row (migration 080), so it is
listed, expires and is revoked on /settings/api-keys like any other key.
Claude Code registers it with
claude mcp add --transport http altorank https://app.altorank.co/api/mcp;
ChatGPT and Claude.ai take the same URL as a custom connector.
Neither the CLI nor the MCP server can approve an article or delete anything —
not by configuration, but because the agent API has no such call and no DELETE
handler at all. Nor can either of them publish: the single endpoint that reaches
a CMS is POST /articles/{id}/retry-publish, which re-runs a publish that
a human already approved and that then failed. An article in draft or review
is refused, and the refusal tells the caller to hand it to a person
(apps/web/app/api/agent/v1/articles/[id]/retry-publish/route.ts:13-35).
Database
apps/web/supabase/ carries a config.toml and the numbered migrations, which
apply in order. With the Supabase CLI:
supabase start applies every migration to the local database on first
start (supabase db reset re-applies them from scratch). Do not run
supabase db push for a local stack: it targets the linked remote project.
Against a hosted project, supabase link --project-ref <ref> first, then
supabase db push. The app will not get far without the migrations: every
query targets tables they create.
docker/ has a container setup if you would rather not run Node directly.
Layout
Licence
GNU AGPL-3.0-only. Full text in LICENSE.
In practice: self-host it, run it for your own clients, commercially, and you owe nothing and publish nothing. The one obligation only reaches people rebuilding the product. If you modify the source and offer that modified version to others over a network, your changes have to be shared back under the same licence.
Running an account on it is free and unencumbered. Relaunching a modified copy as a closed competing service is not.
Contributing
Issues and pull requests are welcome. Two things that will get a patch rejected regardless of how good the code is:
- Adding a way to publish that is not attributable to a person - a click, or a rule a named member set and can veto. An agent-triggered publish is the canonical example.
- Adding a claim the repository cannot support. If
grepcannot find the feature, the README does not get to mention it.
The code conventions a patch is read against, and how this repository relates to the marketing site, are in CONTRIBUTING.md.
来源:README.md,提交 078c52a
工具
0版本历史
1- v0.3.0最新Sep 16, 2026
评分
已满足适用检查项的 85%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
- 近 30 天内可连通必需25 分
- 已声明认证方式必需10 分
- 已列出工具15 分
请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。
- 描述必需15 分
- 图标10 分
- 文档15 分
- 许可证10 分