Agent setup

MCP server for AI blog writing

Copy one sentence, paste it into any AI coding agent, and it wires up the uprank MCP server itself: 17 tools, 10 resources, 4 orchestration prompts.

A blog-writing MCP server lets your coding agent run the steps of writing an article, such as research, briefing, drafting and scoring, as tool calls instead of in a chat window. uprank exposes 17 tools over MCP: research, briefs, drafts, scoring against 13 hard gates, revision, link suggestions and publication records for Strapi drafts. Every call runs the same pipeline and the same gates as the app, so an article your agent drafts is held to the same rules.

Updated

Add to Claude

Fastest: Add to Claude

Add to Claude

Claude on the web, Desktop or mobile: opens Claude's Add custom connector dialog with uprank's MCP server filled in. Click Add, then approve uprank's consent screen as a workspace owner. No token to copy.

What the agent runs

Fetch and execute the appropriate instructions to set me up for uprank from https://uprank.devino.ca/agent-setup/prompt.md

The agent fetches /agent-setup/prompt.md, asks you once for an MCP token (issued at /mcp), registers the server, and verifies it with article_list.

Set up by hand

Same commands the prompt uses, per agent.

The agents compared

How each guide adds the server and how to see that it loaded. Each row links to the full guide.

AgentAdded withCommand or fileConfirm it loaded
Claude CodeCLI commandclaude mcp add --transport http --scope user uprank https://uprank.devino.ca/api/mcp --header 'Authorization: Bearer ${UPRANK_MCP_TOKEN}'Run claude mcp list: uprank shows ✔ Connected once Claude Code has reached the server. claude mcp get uprank shows that one entry, and /mcp inside a session lists it with its tool count.
CodexCLI commandcodex mcp add uprank --url https://uprank.devino.ca/api/mcp --bearer-token-env-var UPRANK_MCP_TOKENConfig: ~/.codex/config.tomlRun codex mcp list and check that uprank is among the configured servers. Inside the Codex TUI, /mcp shows the active MCP servers.
CursorConfig file~/.cursor/mcp.jsonOpen Customize in the sidebar and choose MCPs: uprank should be listed with its toggle on. Its tools also appear in the tools list at the top of the chat panel.
WindsurfConfig file~/.config/devin/mcp_config.jsonOpen the Actions (...) menu at the top right of the Cascade panel. Its MCPs section lists uprank with the number of tools it has enabled, and a toggle to switch it on or off.
VS Code (Copilot)Config file.vscode/mcp.jsonRun MCP: List Servers from the Command Palette and select uprank to start, stop or restart it, or to show its output. It is also listed under MCP SERVERS - INSTALLED in the Extensions view.
OpenCodeConfig file~/.config/opencode/opencode.jsonRun opencode mcp list: it lists every configured MCP server and its auth status, so uprank should appear there.

What you get

  • 17 tools

    Research topics, generate briefs and drafts, score, revise, suggest links, record draft publications.
  • 10 resources

    Full article bodies, evidence packs, claims, quality assessments, run traces.
  • 4 prompts

    Transparent orchestration recipes: create, improve, refresh, publish.

The 17 MCP tools

Each call is scoped by the credential's scopes and runs the same pipeline and quality gates as the app.

pipeline_run
Run the full pipeline for a topic: research, evidence, brief, draft, claim check, scoring.
pipeline_status
Read a run’s status, current step and any structured error.
brand_ingest
Rebuild the brand profile from pages you list: at least one URL is required and at most 40 are fetched. A sitemap cannot be passed over MCP.
brand_get
Read the brand profile: voice, positioning, proof points.
topic_research
Research one seed query (required) into a single topic opportunity with an Evidence Pack, for a campaign.
brief_generate
Generate and critique an editorial brief for a topic.
article_generate
Draft an article from its brief and Evidence Pack.
article_score
Score a version on the quality dimensions and hard gates.
article_revise
Revise weak sections into a new version, within a bounded loop.
links_suggest
Suggest internal and external links for review.
media_select
Attach a licensed image, or warn visibly when none is available.
publication_create_draft
Record a draft publication for a publish target in uprank; idempotent and safe to retry. Nothing is pushed to the CMS: the Strapi draft is pushed from the article’s Publishing tab, once the version passes its hard gates.
publication_publish
Record a live publication request for a version with a current, passing quality assessment; needs publication:live and confirm "PUBLISH LIVE". Nothing is pushed to the CMS.
publication_status
Read the state of a publication.
refresh_list
List published, approved and needs-review articles; the reason is set only when a time-sensitive claim has expired or the canonical version has no current quality assessment.
article_get
Read an article and one of its versions.
article_list
List articles with site, campaign, status or search filters.

Tokens and scopes

A token can only call the tools whose scopes it holds. Generated from the scopes and tool contracts the server enforces.

  • Issuing a token. A workspace OWNER can issue a token by hand at https://uprank.devino.ca/mcp: a name and the scopes it may use. The raw token is shown once and only its hash is stored. A token issued this way has no expiry date and works until it is revoked.
  • Changing scopes. A token issued at https://uprank.devino.ca/mcp keeps the scopes it was issued with. To change them, issue a new token and revoke the old one. An Add to Claude connection works the same way: its scopes are fixed when the owner approves it.
  • Add to Claude (OAuth). Add to Claude connects through OAuth, so there is no token to copy. Only a workspace OWNER can approve its consent screen, and only for a workspace that person owns. The owner does not pick scopes there: the connection gets the scopes the client asked for out of every scope except publication:live, or all of those scopes when the client asked for none of them. Claude is not the only client that can start the flow: any MCP client that registers itself can reach the consent screen, which treats a client whose callbacks are Claude's or ChatGPT's as verified and warns that any other client is unverified. The connection is stored as a credential, so it appears at https://uprank.devino.ca/mcp with a “connected app” badge, named like “OAuth: Claude”.
  • OAuth lifetime. An Add to Claude access token lasts 1 hour. The client renews it with a refresh token that lasts 30 days. Each refresh issues a new access token and a new refresh token on the same credential, and the old pair stops working. Once the refresh token runs out, or the owner who approved the connection is no longer an owner of the workspace, it stops renewing and has to be approved again.
  • Missing scope. A tool call without every scope the tool needs is refused with UNAUTHORIZED, naming the missing scopes.
  • Never by default. publication:live is never granted by default, and the issue dialog marks it as dangerous. An Add to Claude connection cannot hold it at all.
  • Revoking. A workspace OWNER revokes a token or an Add to Claude connection from the credentials table at https://uprank.devino.ca/mcp. That cuts off every agent using it at once: the next call is refused with a 401 (“Unknown, revoked, or expired MCP credential.”), and a revoked connection can no longer refresh. The revocation is audited. An OAuth client can also revoke its own connection through the standard revocation endpoint (RFC 7009).
  • Audit. Every successful tool call that changes something is written to the audit log, with the tool name and the scopes it required.
ScopeTools that need itResources that need itAdvice
brand:readbrand_getbrandSiteIn the recommended first token
brand:writebrand_ingestNone today
campaign:readtopic_researchcampaign, topicIn the recommended first token
campaign:writeNone todayNone today
research:runpipeline_run, topic_researchNone todayAdd to research, draft, score and revise
article:readpipeline_status, publication_status, refresh_list, article_get, article_listevidencePack, article, articleVersion, claims, quality, workflowRun, publicationIn the recommended first token
article:writepipeline_run, brief_generate, article_generate, article_revise, links_suggest, media_selectNone todayAdd to research, draft, score and revise
quality:runarticle_scoreNone todayAdd to research, draft, score and revise
publication:draftpublication_create_draftNone today
publication:livepublication_publishNone todayNever granted by default
connection:readNone todayNone today
connection:writeNone todayNone today

A tool needs every scope listed for it: pipeline_run needs article:write and research:run; topic_research needs research:run and campaign:read.

Troubleshooting

What you see, the likely cause, and what to do. Each row describes what the server code does.

What you seeLikely causeWhat to do
The consent screen says “Only a workspace owner can connect an app to uprank.” and has no Allow button.Your account is not an OWNER of any workspace, and the screen lists only workspaces you own. The server checks the role again when you press Allow, and refuses with “Only an owner of that workspace can connect an app.”Ask an owner of the workspace to connect the app, or to issue you a token at https://uprank.devino.ca/mcp. Back returns you to the app without connecting.
The consent page says “This connection can’t continue”, with “unknown client_id” or “The redirect_uri does not match any URI this app registered.”The request names an app uprank has no registration for, or a callback address that app did not register. uprank refuses these without sending you back to the app.Start the connection again from the app. If it keeps failing, email support.
The connection works, but it shows the wrong workspace, or nothing you expect.A connection belongs to the one workspace picked on the consent screen. The screen shows a Workspace choice only when you own more than one, and it preselects your current workspace when you own it. A tool call cannot name another workspace.To switch, an owner revokes the connection in the credentials table at https://uprank.devino.ca/mcp, then connects again and picks the other workspace.
Every call fails with HTTP 401 and “Unknown, revoked, or expired MCP credential.”The token is unknown, was revoked, or has expired. An Add to Claude access token lasts 1 hour and is renewed with a refresh token that lasts 30 days. A connection cannot renew once the refresh token has run out, or once the owner who approved it is no longer an owner of the workspace (uprank then revokes it). A token issued by hand has no expiry date, so it is usually revoked or mistyped. The 401 carries a WWW-Authenticate header that points OAuth clients to uprank’s authorization metadata.For an Add to Claude connection, connect again and approve the consent screen as an owner. For a token, check it in the credentials table at https://uprank.devino.ca/mcp; if it is revoked or lost, an owner issues a new one.
HTTP 401 with “Missing or malformed Authorization header (expected "Bearer <token>").”The request carried no bearer token, or the header was not in that form.Send the header Authorization: Bearer <token>. For a hand-issued token, the guide for your agent shows where it reads the token from (UPRANK_MCP_TOKEN).
A tool you expect is not in the tool list.The server lists only the tools whose scopes the credential holds. A tool that needs a scope the credential lacks is not advertised.The scope table above shows which scope each tool needs. A token keeps the scopes it was issued with, so an owner issues a new token with the extra scope.
A tool call returns an error with code UNAUTHORIZED and “Missing MCP scope(s): …”.The credential does not hold every scope the tool needs. A tool called by name is checked the same way as a listed one. The missing scopes are named in the message and in details.missing.Use a credential that holds the named scopes. Some tools need more than one, as the line under the scope table says.
publication_publish is not in the tool list for an Add to Claude connection.An Add to Claude connection never holds publication:live, even if the app asks for it, so the tool is not advertised. The consent screen says “Never live publishing.”Only if you want an agent to record live publication requests: an owner issues a token at https://uprank.devino.ca/mcp with publication:live, marked dangerous in the issue dialog, and gives it to the agent. The call also needs confirm: "PUBLISH LIVE" and a passing quality assessment. It records a live publication request in uprank and does not push to the CMS. There is no separate human approval, so grant it only to an agent you trust.
publication_publish returns QUALITY_GATE_FAILED: “No current quality assessment exists for this version; score it before publishing.” or “The article version has not passed its hard quality gates; live publishing is blocked.”The version has no current quality assessment, or its assessment failed a hard gate. The check runs before anything is recorded, so a refusal leaves nothing behind.Run article_score, or revise the article until the gates pass, then publish again. The error’s suggestedAction says which. The thresholds are listed at https://uprank.devino.ca/quality-gates.
A tool call returns VALIDATION_FAILED: “Input failed schema validation.”The arguments do not match the tool’s input schema. details.issues lists each problem as “path: message”. The error is marked retryable: false. A request body that is not valid JSON gets HTTP 400 and the same code.Correct the arguments that details.issues names and call again. Repeating the same call fails the same way.
HTTP 429 with code RATE_LIMITED: “Rate limit exceeded for this MCP credential; retry after a short delay.”Each credential has a bucket of 60 calls that refills at 1 call per second. Only tool calls and resource reads count; the handshake and the list calls do not. The error is marked retryable: true.Wait a few seconds and call again. Over a long run, space calls out to about one per second.
A tool returns only a workflowRunId and no result (pipeline_run, brand_ingest, topic_research, brief_generate, article_generate, article_score, article_revise, links_suggest, media_select).These tools start a run on the server and return at once. The work carries on after the call returns.Call pipeline_status with the workflowRunId. It returns the status (PENDING, RUNNING, SUCCEEDED, FAILED or CANCELLED), the current step and the progress from 0 to 100.
pipeline_status returns status FAILED with an error object.The run stopped at a step, and currentStep names it. error holds code, message, retryable and, when the code sets them, suggestedAction and step. The code marks a transient failure with retryable: true.Read error.message and error.suggestedAction and fix what they name. When retryable is true you can start the tool again.
An error with code MODEL_OUTPUT_INVALID.The server uses this code for an unexpected failure that has no more specific code, and for a run whose executor threw. It is marked retryable: true.Try the call again. If it repeats, email support with the code, the message and the workflowRunId.
media_select finishes, but the article has no image.No media provider is configured. The tool does not fail and never inserts a placeholder. It records a missing media asset (“No media provider configured.”) and the article completes without an image. The Media tab lists the asset with a “missing” badge.Nothing failed, so there is nothing to retry. Without a media provider the article has no image until one is attached.
publication_create_draft succeeds, but nothing appears in Strapi.The tool records a draft publication in uprank. It does not push anything to the CMS.Push the draft from the article’s Publishing tab in the app, once the version passes its hard gates.
You want to disconnect an agent, or a token may have leaked.A token and an Add to Claude connection are both credentials. They work until they expire or an owner revokes them.An owner revokes it in the credentials table at https://uprank.devino.ca/mcp. The next call is refused with a 401, and a revoked connection can no longer renew.

Still stuck? Email [email protected] with your workspace name and, when there is one, the workflowRunId, the error code and the message.

Common questions

Which coding agents work with the uprank MCP server?
Any agent that can call a streamable-HTTP MCP server with a bearer token. There are setup guides for Claude Code, Codex, Cursor, Windsurf, VS Code (Copilot), OpenCode, and the onboarding sentence on this page works in each of them.
Can an agent publish live without review?
Not unless you allow it. publication_publish needs a credential that holds publication:live, which is never granted by default, the literal confirmation confirm: "PUBLISH LIVE", and a passing, non-stale quality assessment on the article version; otherwise the call is refused with UNAUTHORIZED or QUALITY_GATE_FAILED. There is no separate human-approval check, so grant publication:live only to an agent you trust. Today the call records a live publication request in uprank and does not push anything to the CMS. Every call is audited.
What does an MCP token allow?
Only what its scopes allow. A first token is read-only: article:read, brand:read, campaign:read. Add research:run, article:write, quality:run to research, draft, score and revise, and publication:draft to record draft publications. A workspace OWNER issues the token at https://uprank.devino.ca/mcp; the raw token is shown once and stored hashed.
Does it run the same checks as the app?
Yes. The tools call the same pipeline and domain services as the app, so article_score evaluates the same 13 hard gates: 6 minimum scores and 7 integrity checks. Tenancy and scopes come from the credential, never from request input.
Which CMS does it publish to?
Strapi. A publish target holds your content type and field mapping, and publication_create_draft records a draft publication for it. The push to Strapi is made from the article’s Publishing tab, as a draft, once the version passes its hard gates. No other CMS has a publisher yet. How the connection works: https://uprank.devino.ca/strapi-ai-blog-writer.

Keep reading