An agent can read the whole workspace and move nothing.
netweft is an SEO MCP server: Claude, Cursor or any MCP client reads a workspace's projects, keywords, rank tracking, site audits and context through 25 read-only tools under a scoped API key. Every tool on this surface is read-only over rows netweft has already stored. Nothing here writes, nothing here starts a crawl, and nothing here spends a credit — so handing an agent a key cannot move the balance, which is the property that makes handing one over reasonable in the first place.
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_rank_trend",
"arguments": { "projectId": "…", "keyword": "site audit tool" }
}
}
Connect Claude, Cursor or any MCP client.
Create a key under Settings, then API keys. A client that speaks HTTP points at https://api.netweft.com/mcp with the key in the Authorization header. A client that only starts local servers, such as Claude Desktop, runs netweft-mcp from npm, which relays to the same endpoint.
Setup for Windsurf, Codex CLI, Gemini CLI and the restclaude mcp add --transport http netweft https://api.netweft.com/mcp \
--header "Authorization: Bearer $NETWEFT_API_KEY"
{
"mcpServers": {
"netweft": {
"command": "npx",
"args": ["-y", "netweft-mcp"],
"env": { "NETWEFT_API_KEY": "nw_..." }
}
}
}
{
"mcpServers": {
"netweft": {
"url": "https://api.netweft.com/mcp",
"headers": { "Authorization": "Bearer ${env:NETWEFT_API_KEY}" }
}
}
}
{
"inputs": [
{ "type": "promptString", "id": "netweft-key", "description": "netweft API key", "password": true }
],
"servers": {
"netweft": {
"type": "http",
"url": "https://api.netweft.com/mcp",
"headers": { "Authorization": "Bearer ${input:netweft-key}" }
}
}
}
A scope withholds a subject, not a capability.
Because no tool can do anything but read, narrowing a key does not take away an ability — it takes away a subject. The useful one is billing: it is how a key handed to an outside integration is stopped from reading what the workspace is paying and what it has left. A key with no scopes named gets all 6.
Projects
scope: projects
Projects, their overviews and who the key belongs to
- whoami
- Which workspace the key belongs to, and what it may read.
- list_projects
- Every project in the workspace.
- get_project
- One project's domain, market and settings.
- get_project_overview
- The dashboard's own summary of a project, as one object.
Rank tracking
scope: rank_tracking
Rank trackers, tracked keywords and their results
- list_rank_trackers
- The trackers configured on a project.
- get_rank_tracker
- One tracker's schedule, market and device.
- list_tracked_keywords
- The keyword set a tracker checks.
- get_latest_rank_results
- The most recent check, with each keyword's position.
- get_rank_trend
- A keyword's positions over time, as stored observations.
- get_rank_position_matrix
- Every tracked keyword against every check date, in one grid.
- get_keyword_rank_history
- One keyword's whole record, including the weeks it did not rank.
- estimate_rank_check_cost
- What a check would cost in credits. It estimates; it does not run.
Site audit
scope: audit
Site audits, their issues and the pages they crawled
- list_audits
- Audit runs against a project, newest first.
- get_audit
- One run's status, page count and issue totals.
- list_audit_issues
- The issues found, classified by severity.
- list_audit_pages
- The pages crawled, with what was found on each.
Keywords
scope: keywords
Saved keywords and their tags
- list_saved_keywords
- Keywords saved against a project, with their metrics.
- list_keyword_tags
- The tags a project uses to group them.
Context
scope: context
Project context, competitors, key pages and backlinks
- get_project_context
- What the project has been told about itself.
- list_competitors
- The domains the project is measured against.
- list_key_pages
- The pages the project cares about.
- list_research_log
- What has been researched against the project, and when.
- list_backlink_snapshots
- Stored backlink summaries, by the date they were taken.
Billing
scope: billing
The workspace's credit balance and subscription
- get_credit_balance
- Plan credits, top-up credits and what is reserved.
- get_subscription
- The plan, its period and its limits.
What a key is, exactly.
Shown once
A key is displayed at creation and never again. Only its SHA-256 hash is stored, and the comparison on every request is constant time. A lost key is replaced, not recovered.
Narrowed before it is shown
Scopes are chosen when the key is created, from audit, billing, context, keywords, projects, rank_tracking. A scope this build does not recognise is dropped rather than honoured, so a row written by a newer deploy cannot widen a key here.
Revoked, not deleted
Revoking a key stops it working and leaves the row in place, so the audit log still shows that it existed and what it could reach. Deleting it would remove the evidence along with the access.
Throttled on its own
Requests are counted against the key's public prefix rather than the workspace, so one misbehaving integration does not fill the window for every other key the workspace issued.
Point an agent at it and watch the balance not move.
Keys are created in the dashboard, scoped before they are shown, and revocable from the same screen.
There is no free tier. Three plans from $50 a month, each opening with a free trial.