Before you start
- A Steppr workspace on any plan. The 7-day trial works, and so does Starter.
- The owner or admin role in that workspace. Editors and viewers cannot create API keys.
- A coding agent that supports MCP servers over HTTP, such as Claude Code or Cursor, opened in the repository of the app you want to build tours for.
- The Steppr snippet installed on your site with at least one allowed origin that is a full origin and not a wildcard pattern. This is only needed for preview links. Without it the agent can still create drafts, and you review them from the dashboard.
Create an API key
- In the dashboard, open Settings, then API keys.
- Choose a name that says where the key will be used, for example the developer or tool.
- Choose the access level. Read & write can create and edit drafts. Read only can list and read tours and checklists and nothing else.
- Copy the key. It starts with
stp_api_and is shown once. Steppr stores a SHA-256 hash of it, so it cannot be shown again. If you lose it, revoke it and create a new one.
A workspace can have up to 20 active keys. Issuing one key per developer or per tool lets you revoke a single key without interrupting anyone else.
Connect your agent
The server speaks MCP over Streamable HTTP at https://api.steppr.io/mcp and authenticates with the key in an Authorization header. Replace stp_api_YOUR_KEY in the snippets below with your key. The API keys page in the dashboard shows the same snippets with a new key already filled in.
Claude Code
Run this from your project directory:
claude mcp add --transport http steppr https://api.steppr.io/mcp \
--header "Authorization: Bearer stp_api_YOUR_KEY"By default Claude Code saves the server in its local scope, which is private to you and applies to the current project. Add --scope user to make it available in all of your projects. Avoid --scope project: it writes the server, including the key, to a .mcp.json file in the repository.
Cursor
Add a steppr entry to .cursor/mcp.json in your project, or to ~/.cursor/mcp.json to make it available in every project:
{
"mcpServers": {
"steppr": {
"url": "https://api.steppr.io/mcp",
"headers": {
"Authorization": "Bearer stp_api_YOUR_KEY"
}
}
}
}.cursor/mcp.json to .gitignore before saving the key in it. A key committed to a repository should be revoked.Other MCP clients
Any client that supports remote MCP servers over Streamable HTTP with a custom request header can connect. It needs these three values:
URL: https://api.steppr.io/mcp
Transport: Streamable HTTP
Header: Authorization: Bearer stp_api_YOUR_KEYCheck the connection
In Claude Code, claude mcp list shows whether the server connected. In any agent, ask it to call the get_workspace tool. The result names the workspace the key belongs to, the key's access level, the plan and the plan limits that apply to authoring.
Example prompt
Describe the flow the way you would brief a colleague: which page, which elements, in what order, and where in the repository the relevant components are.
Use the steppr MCP server to draft a product tour called "Create your first project".
It should run on the /projects page: point at the New project button and advance
when the user clicks it, then point at the project name field and wait until it
has a value, then finish with a short modal.
Read the components under src/features/projects to find the selectors. Prefer
data-testid attributes. If an element has no stable hook, tell me before adding one.What the agent does with it
The exact sequence is up to the agent, but the tool descriptions and the authoring guide steer it towards this:
- It calls
get_authoring_guide. The guide is a Markdown reference covering step types, selector rules, the recognisedconfigkeys, copy limits, targeting and trigger shapes, and error codes. - It calls
get_workspaceto confirm the key can write and to read the plan limits, and usuallylist_toursto avoid duplicating an existing flow. - It reads your components and picks a selector for each anchored step, in the same priority order as the click-to-build picker: a
data-testidattribute first, then a stableid, then a short chain of stable classes. The guide tells it not to guess, and to propose adding adata-testidwhen an element has no stable hook. - It calls
create_tour_draftonce, with the name, every step, the targeting rules and the triggers. Steppr validates the input and writes the tour and its steps in a single transaction, so a failed call leaves nothing half-built. - It reports back with what it built and the review links from the tool result.
For the prompt above, the arguments to create_tour_draft look like this:
{
"name": "Create your first project",
"steps": [
{
"type": "tooltip",
"selector": "[data-testid=\"new-project-button\"]",
"title": "Start a project",
"body": "Projects hold your boards and files. Click **New project** to create one.",
"config": {
"advanceOn": "anchor-click"
}
},
{
"type": "tooltip",
"selector": "[data-testid=\"project-name-input\"]",
"title": "Name it",
"body": "Give the project a name. You can rename it later.",
"config": {
"requireToAdvance": {
"type": "anchor_has_value"
}
}
},
{
"type": "modal",
"title": "Project created",
"body": "Invite a teammate from the **Team** page when you are ready."
}
],
"targeting": [
{
"type": "url_match",
"pattern": "/projects",
"match": "contains"
}
],
"triggers": [
{
"type": "page_load"
}
]
}The result is the full tour object, the same shape as the REST API's tour, with status set to draft and a links object. It is preceded by a sentence telling the agent that the tour is not live and that only a person can publish it.
Review and publish
Agents make mistakes with selectors. An element may only render for some users, a list may contain several matches, or the agent may have added a data-testid that is not deployed to the site you are previewing. Reviewing the draft is part of the workflow, and it is the reason the API has no publish operation.
Every tool that returns a tour includes two links:
links.previewUrlopens your own site with the draft rendered by the snippet. Targeting and triggers are ignored in preview so the tour starts straight away. The link opens the site root, so navigate to the page the tour is for. It carries a signed token that expires after 24 hours, and any later call that returns the tour includes a fresh link. It isnullwhen the workspace has no usable allowed origin, when the key is read only, or when the subscription is not active.links.dashboardUrlopens the tour in the dashboard editor. It does not expire. Checklists only have this link.
Step through the tour in the preview. When a selector does not match, the snippet waits up to three seconds for the element to appear and then shows that step as a centred card. A tooltip that appears in the middle of the page instead of next to its element is the sign of a missed selector. To fix one, open the tour from the dashboard link, start the builder on your site and click the correct element. The picker generates the selector for you. You can also ask the agent to correct it with update_step.
When the draft is right, publish it from the dashboard. If the agent edits a tour that is already published, the change is saved to the draft only. Your users continue to see the published version, and the tour reports hasUnpublishedChanges: true until someone republishes.
Tool reference
Tools that write require a Read & write key and an active subscription or trial. Every tool that changes a tour returns the full updated tour, including current step ids and order.
| Tool | What it does | Arguments |
|---|---|---|
get_authoring_guide | Returns the Markdown authoring guide. Agents are told to read it before their first write. | None |
get_workspace | Workspace slug, plan, subscription status, the key’s role, and the authoring limits for the plan (tour, checklist and item caps, and whether event triggers are available). | None |
get_install_snippet | The workspace’s script tag (public key, SDK and API URLs) and its allowed origins, so the agent can install Steppr in your app itself. | None |
add_allowed_origin | Adds one origin to the allowlist, for example the app’s dev origin. Add-only and idempotent; origins are removed in the dashboard. Fails at 10 origins. | origin |
list_tours | Every tour in the workspace with its status and step count. | None |
get_tour | One tour with its steps, targeting, triggers and review links. | tourId |
create_tour_draft | Creates a draft tour with all of its steps in one call. Counts towards the plan’s tour limit. | name, steps (1 to 50), optional targeting and triggers |
update_tour | Renames a tour or replaces its targeting or triggers. Cannot change status. | tourId, any of name, targeting, triggers |
add_step | Adds a step. With a position it inserts there and shifts later steps; without one it appends. | tourId, type, optional selector, title, body, config, position (0-based) |
update_step | Changes fields on a step. A config value replaces the whole config object. | tourId, stepId, any of type, selector, title, body, config |
delete_step | Removes one step from a tour. | tourId, stepId |
reorder_steps | Sets the step order. | tourId, stepIds listing every step of the tour exactly once |
list_checklists | Every checklist in the workspace with its status and item count. | None |
get_checklist | One checklist with its items, targeting and dashboard link. | checklistId |
create_checklist_draft | Creates a draft checklist with all of its items in one call. There are no tools for editing a checklist afterwards; finish it in the dashboard. | name, items (1 to 50, subject to the plan’s item limit), optional targeting |
Field-level shapes for steps, targeting rules, triggers and checklist items are in the API reference. The MCP tools and the REST endpoints validate with the same schemas.
Permissions and security
- A key belongs to one workspace. There is no workspace parameter on any tool, so a key cannot reach another workspace.
- Keys are accepted only by the MCP server and the
/api/v1authoring API. The rest of the Steppr API rejects them, so a key cannot read or change billing, team members or other API keys. - A key's access is Read & write or Read only. It can never have admin or owner rights, whoever created it.
- No tool publishes, archives or deletes a tour or checklist, and none can change a flow's status.
- The full key is shown once. Steppr stores a SHA-256 hash and a short display prefix so you can tell keys apart in the list.
- Revoking a key from the API keys page takes effect on the next request. The page also shows when each key was last used.
- Writes need an active subscription or trial. When a trial ends or a subscription lapses, keys can still read but every write returns
SUBSCRIPTION_INACTIVE. - Requests are rate limited to 120 per minute per IP address.
Treat a key like any other secret. Keep it out of the repository, out of shared agent configuration files and out of CI logs.
What is not supported
- Publishing, archiving or any other change of status. These happen in the dashboard.
- Deleting tours or checklists. An agent can delete individual steps only.
- Editing a checklist after it has been created.
- Announcements. They are created in the dashboard.
- Theme presets and tour chaining. Drafts use the workspace default theme until you change it in the editor.
- Elements inside a Shadow DOM or a cross-origin iframe on your site. The snippet cannot target them, so the agent is told to choose a nearby element or use a modal step.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| The server fails to connect, or every call returns UNAUTHORIZED | The header is missing or malformed, or the key has been revoked. | The header must be exactly Authorization: Bearer stp_api_…. Check the key is still listed on the API keys page. If not, create a new one and add the server again. |
| The agent does not list any Steppr tools | The agent loaded its MCP configuration before you added the server. | Restart the agent or reload its MCP servers, then check the connection as described above. |
FORBIDDEN | The key is Read only and the agent tried to write. | Create a Read & write key and reconnect with it. |
SUBSCRIPTION_INACTIVE | The trial has ended or the subscription has lapsed, so the workspace is read only. | Reactivate the subscription from Settings, then Billing. |
TOUR_CAP_REACHED, CHECKLIST_CAP_REACHED or CHECKLIST_ITEM_CAP_REACHED | The plan limit has been reached. Drafts count towards it. | Delete a flow you no longer need from the dashboard, send fewer checklist items, or upgrade. |
FEATURE_GATED | The draft uses an event trigger and the workspace is on Starter. | Use a page_load or url_match trigger, or upgrade to Growth. |
links.previewUrl is null | The workspace has no allowed origin that is a full origin, the key is Read only, or the subscription is not active. | Install the snippet and add your site’s origin under allowed origins, then fetch the tour again. The dashboard link always works. |
| The preview link no longer works | Preview tokens expire after 24 hours. | Ask the agent to call get_tour, or use the Preview button in the dashboard editor. |
| A tooltip shows in the centre of the page in preview | Its selector did not match within three seconds. If the agent added a data-testid, that change may not be running on the site you opened. | Re-pick the element with the builder, or deploy the change and preview again. |
RATE_LIMITED | More than 120 requests in a minute from one IP address. | Wait a minute. A typical authoring session uses a handful of calls. |
If something here does not match what you see, email hello@steppr.io with the error code and the tool name.