Skip to main content
The Attensira MCP server exposes 33 tools at https://mcp.attensira.com/mcp over Streamable HTTP. Every tool takes an optional project; omit it and your credential’s own workspace is used. Seventeen tools are read-only, three spend credits, and three delete data permanently. This page lists every tool with its parameters, defaults, and return shape. Sixteen of these tools have an exact twin in the REST API; the rest are MCP-only for now, and each says so below. Use MCP when an assistant is doing the work; use REST when your own code is.

Which credential each tool needs

A workspace API key is minted as read or read and write. Read tools work with either; the tools in the left column need a read-and-write key. Calling one with a read key returns 403 with type: "forbidden" and the challenge WWW-Authenticate: Bearer error="insufficient_scope", scope="write" — the credential is valid, it simply may not do this. Scope is fixed when the key is minted and cannot be widened: mint a read-and-write key and swap it in. An OAuth connection always carries read and write. Approving a client grants it your organisation, and there is no read-only consent — the scopes in the token are the authorization server’s own (openid, profile, email, offline_access, user:org:read), none of which names an Attensira permission. Restrict a connected assistant by what you ask it to do, or by the tool allow-list your client offers, not by scope. get_account returns the scopes in force, so call it first from a new integration rather than discovering the gap on a failed write.
One tool is key-only: get_ai_traffic_install hands back your workspace’s signing secret, and a signed-in connection is refused there on purpose — a consented OAuth token must never be able to read one credential out and turn it into another. Call it with an API key.

Before you start: what costs money and what destroys data

Three tools spend credits and three are destructive. Nothing else on this page produces a bill or erases history.
run_automation accepts an idempotency_key. Pass one on every call. It maps to the Idempotency-Key header upstream, so a retried or duplicated call does not produce a second billed run.
The get_analytics area values for a topic rollup and a per-surface rollup are topic and platform. A platform is a stable identifier for an AI answer surface (ChatGPT, Perplexity, Google AI Overviews, Claude, Gemini) that survives the underlying model being replaced, so two windows a year apart stay comparable on the same key. The older wire words group and engine are no longer accepted.

Reading what comes back

Every rate is {value, n} and every delta is {value, real}. A value of null means not measured; 0 with n > 0 is a measured zero. Per-platform metrics live in a platforms map keyed by platform, and each entry carries {tracked, readable}: tracked: false means your plan does not include that platform, so it was never queried, and readable: false on a tracked platform means nothing came back in the window that could be scored. Treating either as 0% invents a failure that did not happen. Every ranked list carries id and label on each row, so the row can be handed straight to the detail tool that takes the id. For the full treatment of null against zero, small n, and when a delta is worth acting on, read Reading the numbers.

Find and measure

Ask these tools the questions you would ask an analyst: “which prompts am I losing on Perplexity?”, “what changed since last week?”, “which sources decided the answers?”, “does anyone cite our pricing page?“.
Read-only. No credits.
One search across the workspace’s prompts, pages, automations and agent sessions. Use it to locate something by wording when you do not have an id — a prompt that sounds like the one you have in mind, the page you half remember the title of. Returns total, has_more and hits. Each hit carries type (prompt, page, automation or session), id, title and, where there is one, a snippet. A hit whose label starts with the query ranks above one that merely contains it; at equal footing prompts come before pages, then automations, then sessions. Every string on a hit is capped at 400 characters, so a complete model answer can never come back through search — for the answers themselves, use answer_history or answer_slice. Page on has_more. total counts what matched up to the session-search ceiling, so it is a floor rather than a grand total.

get_analytics

Read-only. No credits.
The main measurement tool. One call returns a ranked slice of your tracking data for a window. The envelope is {area, days, window, order, filter, rows, total_rows, truncated} plus the area’s own headline numbers. total_rows is how many rows survived the filter and truncated whether limit cut them, so a short list can be told from a cut one. Every row carries id, label, the rates that apply to the area and, where the area has one, a platforms map.
Response — area: prompt
area: "bot" rows carry visits, pages, purpose_mix, last_seen (null when it never came) and agents instead of the rate fields, and answer with a note when no edge collector has ever reported — zero rows there means uninstrumented, not uncrawled.
area: "visibility" returns share of voice per platform — the fraction of runs on that platform that named you, not a share of a category that sums to 100%. Competitor rates (area: "competitor") use the same denominator as yours, so they do not sum to 1 either.

deciding_sources

Read-only. No credits. MCP-only.
Which pages and domains actually decided the AI answers — the listicles, reviews and docs the models leaned on — whether you already appear on each, and the next move for each. Unlike get_analytics with area: "source", which ranks by citations, this ranks by influence over a decision. See Deciding sources. Returns groups, most influential first, one per prompt × platform × surface. Each group carries a label in words, n (successful answers read), present (whether any source in the top ten is yours), a recommendation, and sources ranked by weight: domain, url (the exact page when one carried it, else null), citations, share, present, and action — the next move in words, such as “get listed” or “fix your own page”.

win_plan

Read-only. No credits. MCP-only.
The plan for winning one tracked prompt: what is deciding the answer today, what to change, and in what order. Ask for a prompt the workspace is losing — deciding_sources says which those are. Returns prompt, n, evidence (measured, published or hypothesis), steps in order — each with a title, a why sentence built from the readings, a target page or domain (or null when it is your own site generally), the platform it acts on and a credits_estimate — plus rereads_at and credits_estimate for the whole plan. Nothing here claims movement: the footer says so until a re-read has proven a change.

get_prompt

Read-only. No credits.
Everything recorded for one prompt: where it is filed, its rate per platform, and who was named and cited instead. Returns id, text, topic (null when unfiled), country (null for the workspace default), visibility, citation, delta, position, answers_read, failures, a platforms map, competitors (each with name and a rate on this prompt’s own answers), sources (each with url, domain and a rate), and why — the standing in sentences, each built from a number on the same response. Passing exact text saves a search round-trip when you already know the wording; inexact text will not match.

get_page

Read-only. No credits.
How one page performs in AI answers: its citation rate on every answer sampled, per platform, and the prompts whose answers cited it. For whether AI systems are fetching the site at all — as opposed to citing it — call get_analytics with area: "bot"; a model can only cite a page it has fetched, so that is worth checking before rewriting content. Returns url, title (null when it could not be read), citations and citation as a rate on total_answers, a platforms map whose entries carry the page’s citation rate on that platform’s own answers, prompts — each with id, text, citations and a rate on that prompt’s answers — and in_sitemap. The delta is {value: null, real: false}: the page fold has no earlier window to compare against, and the contract’s word for that is “no basis”, not a number.

The receipts

The numbers above are folds over stored answers. These four tools hand back the rows themselves, verbatim, which is what record_observation cites and what a person asks for when a number looks wrong. All four are MCP-only.

answer_history

Read-only. No credits. MCP-only.
Every sampled answer to one tracked prompt, verbatim and newest first, with citations and reading ids — the receipts behind get_prompt. Returns answers, readings (on this page), has_more and next_cursor (null at the end). Each answer carries reading_id and sample (its index within the reading), prompt_id and prompt, platform, surface (consumer or api), country, day, answered_at, text verbatim, text_bytes, truncated, mentioned, cited_own_domain, citations in order (url, domain, position), competitors_named, and failed. Answers over 8 KB are cut on a character boundary and flagged truncated: true, with text_bytes carrying the full length. A failed sample is listed with failed: true and an empty text, never dropped: a bad week must not look like a quiet one.

answer_slice

Read-only. No credits. MCP-only.
Every answer matching a predicate, verbatim. Terms AND together and select the sample; at least one is required. Same row shape and the same 8 KB cut as answer_history. When an answer-level term is set (surface, competitor_named, cited_domain, brand_named), only the samples that satisfy every term come back, and failed samples are excluded — a sample that did not happen cannot be judged. With only reading-level terms (platforms, country, dates) every sample of the selected readings is returned, failed ones flagged.

citation_timeline

Read-only. No credits. MCP-only.
One domain’s or one page’s citations per day, per platform, with mean position and how many prompts cited it — the same rollup get_analytics with area: "source" ranks, kept day by day. Returns domain, url (set when the question was one page), total, prompts, and series — one entry per platform, most cited first, each with points for every day the window touches: day, citations, mean_position (null when nothing that day carried a position) and prompts. A zero day is a real zero.

page_history

Read-only. No credits. MCP-only.
One of the workspace’s own pages: every version captured, when, and what changed between them. Use it before claiming a page changed. Returns url (normalised), known (whether the page is in the workspace’s inventory), versions and snapshots oldest first — each with id, first_seen_at, status, title, description, word_count, json_ld (present, absent or not_captured), canonical, robots, changed_bits and changes, the fields that moved since the version before (field, from, to). Metadata on a version taken before it was recorded reads not_captured, and is never reported as a change. A page on another domain is refused with a 404.

Track

These tools change what gets measured. Reach for them when the answer is “we are not tracking the right things”: “start watching these five buying-intent prompts”, “stop wasting a slot on that one”, “add the competitor who keeps showing up in answers”.

add_prompts

Costs credits. Needs a read-and-write key.
Adds one or more prompts to the workspace. From the next daily run, each new prompt is read across every platform your plan tracks. There is no platform argument — which surfaces a prompt runs on comes from the plan, not from the caller. Returns added — every prompt now being tracked, with id and text. A prompt that was already tracked comes back in added too, with its existing id, so a repeated call is idempotent all the way out; skipped is empty today. credits_spent and credits_remaining are null: tracking is charged as the prompts are read, not on this call. Your plan caps how many prompts you can hold at once, and a paste that would exceed it is refused with a 409 naming how many slots remain — see Plans.

remove_prompt

Destructive. Needs a read-and-write key.
Stops tracking a prompt and frees its slot. Confirm the prompt with get_prompt first — this cannot be undone. Returns id and removed: true. No new readings are collected for that prompt afterwards, so any trend line for it ends on the day you remove it.

add_competitor

Needs a read-and-write key, but does not spend credits.
Tracks a competitor domain so it is scored alongside the project in competitor analytics. It does not create new readings, so it costs nothing. Returns the competitor: id, domain, name. Competitor share of voice uses the same denominator as your own — successful runs naming the brand over all successful runs — so adding a competitor never changes your numbers.

remove_competitor

Destructive. Needs a read-and-write key. MCP-only.
Stops scoring a rival. Past readings keep what they already recorded, so history does not move — the rival simply stops being scored from here on. Returns id and tracked: false.

Inbox

Everything waiting on a human. Natural questions here sound like “is anything blocked on me?”, “why has nothing happened since Tuesday?”, “I connected GitHub — clear that off my list”. See Inbox for what ends up there.
The four inbox tools are MCP-only today; the REST API does not reach the inbox yet.

list_inbox

Read-only. No credits.
Everything waiting on a person: approvals the agent stopped for, work it could not finish alone, failed automations, and approvals that expired unanswered. Each row carries typework_item, ask or task — plus title, reason, session_id and updated_at. type decides how it is acted on: a task is resolved with resolve_inbox_task, an ask is answered in its own session (session_id), and a work_item is approved or declined with the two tools below. Worth calling before concluding the agent is idle. A workspace with rows here is one where nothing is moving until somebody answers.

resolve_inbox_task

Needs a read-and-write key, but does not spend credits.
Closes a task the agent raised. done means the thing the agent needed has actually been handled — the integration connected, the decision made — not that you plan to handle it. Nothing is queued to run when you send it.

approve_work_item

Needs a read-and-write key, but does not spend credits.
Says yes to a work item the agent stopped for, and lets it carry the change out. Only a row whose type is work_item is approved this way. Idempotent: approving twice approves once, so a retry after a timeout is safe. Approving is the customer’s decision to make, not one to infer from the row.

decline_work_item

Needs a read-and-write key, but does not spend credits.
Says no to a work item, with the reason why. The reason is required and is the point of declining rather than ignoring: it is what stops the same proposal coming back. wrong means the proposal is incorrect, not_now right idea wrong time, already_done handled elsewhere, never_touch do not propose this again for this page or topic.

Automations

Automations are scheduled work: a weekly digest, a recurring audit, a check that runs after every deploy. Natural questions here sound like “email me a summary every Monday”, “what is already scheduled?”, “run last week’s report again now”.

list_automations

Read-only. No credits.
Lists every automation in the workspace as automations: each with id, name, instruction, trigger, allowed tools, status (active, paused, or done), timezone, run_at_minute, and last_run_at (absent when it has never run). Takes no parameters.

get_automation

Read-only. No credits.
Full definition for one automation, with its most recent run inline as latest_run ({id, status, state}, or null when it has never run) — so “did my Monday report run?” costs one call, not two.

create_automation

Needs a read-and-write key. Creating costs nothing; each run it triggers does.
Defines a new automation that runs an instruction on a trigger. Returns the created automation with its id. Creation is free; every scheduled execution spends credits like a manual run.

run_automation

Costs credits. Needs a read-and-write key.
Triggers an automation immediately, outside its trigger. Returns a session handle — session_id, status and poll_after_ms — to poll with get_session, not the finished result.

delete_automation

Destructive. Needs a read-and-write key.
Permanently deletes an automation and its schedule — this cannot be undone. Its past runs are sessions and survive. Confirm it with get_automation first. Returns id and deleted: true.

update_automation

Needs a read-and-write key, but does not spend credits. MCP-only.
Changes one automation in place — a partial edit. A field you do not pass is left alone, so pausing an automation cannot quietly rewrite what it does. Pausing is how a schedule is stopped without losing it — deleting is the one that cannot be undone. Returns the automation in the shape shown under list_automations.

Agent

The agent tools run a chat inside your workspace, with your tracking data in reach. Use them for questions that need reasoning across several slices — “why did our share of voice drop on Perplexity last week?”, “draft a plan for the three prompts we lose most” — rather than for numbers you can pull directly with get_analytics.

ask

Costs credits. Needs a read-and-write key.
Open-ended investigation the other tools cannot answer — why a prompt is losing, what to change on a page — run by an agent that crawls pages, audits them as a model sees them, and searches the web. Try get_analytics, deciding_sources, win_plan, get_prompt or get_page first: those are free and immediate, this costs credits and takes time. Returns session_id, status (running at first — that is the success case, not an error), answer (null until complete) and poll_after_ms. Wait that long, then poll get_session with the returned id until status is complete.
The agent runs on an agent model — the LLM powering the chat. That is a different thing from a tracked platform, which is the answer surface Attensira reads on your behalf. Changing your agent model does not change what is measured.

get_session

Read-only. No credits.
Fetches a session started by ask or run_automation: its status and, once finished, its answer. Use this to poll async work. Returns id, status (complete, running, failed), state (the engine’s own finer word — a run parked on a question for you reads awaiting_person under a running status), answer (the agent’s last message once complete; null while running or on failure), and events — present only when requested, each with a type such as tool.start or text.delta and the fields of that event — the way to see which tools the agent called and with what arguments.

Account and settings

get_account

Read-only. No credits.
Returns the org, every workspace you can reach, the one this call resolved to, the credit balance, which platforms that workspace tracks, and what this credential may do. Takes no required parameters. Call it first from a fresh integration — to collect the ids the project parameter takes, to confirm which workspace the credential points at, and before reporting any per-platform number: platforms is the authority on which platforms were queried at all, so a platform absent from it was never measured rather than measured at zero. Returns org (id), project (id, name, domain — the workspace this call resolved to), workspaces (every workspace in the org, each with id, name, domain), credits (available, available_usd, held_units; absent when the balance could not be read, never a zero standing in for an outage), scopes — what this credential may do — and platforms. project is null when the organisation has several workspaces and the call named none. That is the answer rather than an error: workspaces carries the ids, and every other tool then needs an explicit project. platforms is empty in that case too, because platforms belong to a workspace rather than to the organisation. This is the only tool that answers without a workspace, so it is always the right call when another tool asks you to name one.

get_brief

Read-only. No credits. MCP-only.
The same brief the morning email carries: the artifact of the day, what needs a person, counts for the window, and what re-reads when. See The morning brief. Returns date, subject, text (the brief itself, as the email body), and sections with needs_you (at most three rows, each with an inbox id and title). It reports counts, never a day-over-day comparison, until a seven-day window exists, and says “no proven change yet” until a verified re-read.

get_ai_traffic_install

Read-only. No credits. Key-only.
Returns everything needed to start sending AI-crawler hits to Attensira: the ingest endpoint, the HMAC signing secret for your workspace, the signature header name, the replay window, the daily cap, and a copy-pasteable edge worker. Takes no parameters. Call it when AI traffic is empty and you need to know how to send us any. The signing secret is derived from the workspace id, so it is stable and can be shown again — unlike your API key, which is displayed exactly once. Because the response carries a secret, a signed-in OAuth connection is refused here with a message saying so; use an API key.

connect_github

Needs a read-and-write key, but does not spend credits.
Starts connecting a GitHub repository: returns the install link for the Attensira GitHub App, scoped to this workspace. Call it when a fix needs a pull request and the workspace has no repository connected. Takes no parameters. Returns url — the App install link, and nothing else. GitHub hands back a user-to-server code only to a browser that completes the install, so the connection exists only once a person has followed the link. Each call mints a fresh single-use link, so fetch a new one rather than reusing an old one.

update_settings

Needs a read-and-write key, but does not spend credits. MCP-only.
Sets how far a run may go on its own, and which paths act mode may touch. Absent fields are left alone. This is the customer’s decision: change it on their instruction, never to finish a task. See Approval. At least one field is required. Returns the settings in force: unattended_mode, the effective act_path_allowlist, act_paths_are_default, publish_without_approval and send_without_approval.

Memory

Two writes into what the workspace knows about itself. See Knowledge and skills and What we know.

record_observation

Needs a read-and-write key, but does not spend credits. MCP-only.
Writes down something durable about this workspace so every future run starts knowing it — a pattern across answers, a source that keeps deciding. Ids are resolved against the workspace before anything is stored, so a guessed one is refused rather than remembered. Returns the observation with its id, statement and n.

write_skill

Needs a read-and-write key, but does not spend credits. MCP-only.
Records a rule this workspace wants followed — how to name things, a claim never to make, a procedure. Every future answer and draft obeys it. Write one the moment a customer states a preference as a rule (“always…”, “never…”). Creates only; revising is done in the dashboard. Returns the skill with its id, title and kind.