DevTune MCP
Server Details
Connect Claude, Cursor, and other MCP-compatible coding agents to DevTune AI search visibility data with the Streamable HTTP Model Context Protocol server.
DevTune exposes a Model Context Protocol (MCP) server so that AI agents can query your AI search visibility data directly. This lets agents like Codex, Claude, Cursor, and other MCP-compatible tools access your metrics and data directly.
- Status
- Healthy
- Uptime
- 100.0% over the last 24 hours
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 115 tools
The 115-tool surface contains several overlapping read families: Agent Picks has summary/test/history/cells/runs/actions/schedule/starter-test variants, Accuracy has get/list/contradiction/decision tools, and citation/visibility/competitive tools overlap heavily. There is even an explicit alias tool (devtune_get_citation_analysis for devtune_get_top_citation_pages). Descriptions are detailed, but an agent must read carefully to avoid misselection.
Every tool uses the devtune_ prefix with snake_case verb_noun naming. Verb choices vary semantically (get/list/read, decide/review/change), but the pattern is predictable throughout with no camelCase or structural inconsistency.
115 tools is far beyond a well-scoped MCP surface and exposes many niche analytics, Agent Picks, Dex, Library, webhook, and lifecycle operations at once. Even for a broad product, this is an extreme count that will burden tool selection and context handling.
Coverage is broad across analytics, actions, drafts, Agent Picks, Library, Dex, and webhooks, but there are notable gaps: prompt and topic lifecycle management is read-only, and some referenced tools such as devtune_get_content_sources, devtune_get_agent_picks_catalogue, and devtune_restore_custom_agent are absent. Several operations are explicitly deferred to the in-app experience, creating dead ends for an agent.
Publisher details
- Operator
- DevTune · Publisher source
- Operator website
- https://devtune.ai · Publisher source
- Vendor relationship
- First-party · Publisher source
- Documentation
- https://docs.devtune.ai/api-reference/overview · Publisher source
- Trust center
- Unknown
- Restrictions
- Paid plan required. 14 day trial available. · Publisher source
Available Tools
115 toolsdevtune_acknowledge_retrieval_restrictionADestructiveIdempotentInspect
Acknowledge an intentional retrieval restriction for only the exact URLs displayed in an audit finding. Requires explicit customer confirmation and actions.write. Preserves the finding, evidence and score. Never infer customer intent. A conflict with reason intent_saved_refresh_pending means the intent was saved and is in effect; the linked action will refresh the next time it is reconciled, so do not repeat the call.
Inputs: urls (required), findingId (required), auditRunId (required), confirmedIntent (required).
devtune_attach_outcome_urlADestructiveIdempotentInspect
Attach a published URL to a completed action. Obtain human approval first. Measurement starts at the action completion date (the declared went-live date), independently of crawling or page-tracking allowance. publishedUrls replaces the published-URL list; retain existing entries. Existing measurement dates cannot be overwritten. Requires actions.write.
Inputs: url (required), actionId (required), publishedUrls (required), changeEventId.
devtune_cancel_agent_picks_testADestructiveIdempotentInspect
Cancel a queued or running paid Agent Picks test or re-test. Queued runs are cancelled at once and reserve nothing more; running runs keep their reservation until they settle, so a refund is not immediate: refunded_micros and released_at on devtune_get_agent_picks_test show when credits return. Returns status cancelled and test_id; a repeat returns the same. Starter tests cannot be cancelled (not_found). An ended test is refused as test_finished. Works while the account is paused. Requires actions.write and Agent Picks. The OAuth member, or the member who created the API key, needs project management rights.
Inputs: test_id (required).
devtune_change_action_statusADestructiveIdempotentInspect
Move an action through its lifecycle as the member who created the API key or authorized this connection; they must manage actions in this project. Transitions come in pairs: accept a suggestion and unaccept it; archive and restore; block and unblock accepted work; mark_live and reopen. accept and archive of a suggestion, and their inverses, act on every suggestion merged into it. unaccept returns an accepted suggestion to the queue only while nothing has happened to it: no owner, never live, not blocked or in progress, nothing measured, and no brief, draft, edit, Library item, retest, prompt request added from another prompt, or dismissal note attached, whenever it was written; otherwise it is refused and the action stays accepted. Actions someone created, such as prompt actions, and acceptances recorded before DevTune noted they came from a suggestion, are refused too. Each undo is kept in the action's acceptance history, which outlives the suggestion if a later refresh replaces or drops it. restore returns archived work to the status it had, including live. Work archived while blocked returns to blocked, except work archived before DevTune kept that state, which returns to the status it had before it was blocked. mark_live opens the before/after measurement in Results from now, or from liveOn, the UTC day the fix went live (today or up to 14 days back); an optional publishedUrl is added to the pages the action already carries, which all stay. mark_live with liveOn on a live action moves its go-live date and rebuilds its measurement from that day; a measurement that has closed or is dated by a recorded page change keeps its date and the move is refused with invalid_transition. reopen keeps the measurement, its go-live date and its published pages. A high-stakes target page refuses accept until acknowledgeHighStakes is true, which needs a human's confirmation; a locked page refuses it. Repeating accept, unaccept, archive, block, unblock, reopen, or mark_live without a new page or go-live date changes nothing and returns changed false; restore of an action that is not archived is refused with invalid_transition, because the status it would return to is not known. A refusal is a 409 with reason invalid_transition, not_reversible, acknowledgment_required, page_locked, superseded or conflict (the action, its merged suggestions or its target page's protection changed during the request, or the merged suggestions cannot all move in one change), and nothing is written. Some suggestions archived before DevTune recorded which suggestions were archived together share their archive time with others and are always refused with conflict; they stay archived. The credential and member are checked again where the change is written, so access revoked mid-request refuses it. Returns a receipt of the transition as it applied: fromStatus, toStatus, blocked, actionIds affected and transitionedAt. It is not a current read; use devtune_get_actions for that. Nothing is published to the customer's site.
Inputs: actionId (required), transition (required), liveOn, publishedUrl, +1 more.
devtune_claim_content_changeAIdempotentInspect
Claim a detected change as a completed measured action. Obtain human approval first. Re-claim restores the original action and measurement without overwriting their content. Returns a conflict when the page has another measurement completed within 14 days of the change, or a concurrent measurement update requires a retry. Requires actions.write.
Inputs: title (required), description (required), changeEventId (required).
devtune_clear_agent_picks_setupADestructiveIdempotentInspect
Remove one of the project's Agent Picks setups. Its tests and results stay readable, its schedule stops, and its suggested Actions nobody has accepted are removed. With several setups, pass setup; without it the call is refused as agent_picks_setup_required. Removing the last setup leaves the project with none until one is saved again. Removing a setup that is already gone is a no-op. Requires actions.write and Agent Picks. The OAuth member, or the member who created the API key, needs project management rights.
Inputs: setup.
devtune_close_draft_pull_requestADestructiveIdempotentInspect
Close the open pull request DevTune opened from an action's draft and delete DevTune's branch, or archive its GitBook change request, as the member who created the API key or authorized this connection; they must manage this project. Works even when content pull requests are no longer enabled, so a pull request can always be withdrawn. The draft stays. Refusals: no_pull_request, pull_request_merged, source_needs_reconnect (reconnect GitHub or GitBook, or close it there), github_error and gitbook_error. Returns the closed pull request.
Inputs: actionId (required).
devtune_create_draft_pull_requestADestructiveIdempotentInspect
Open a pull request on the customer's content repo, or a change request in their GitBook space, from an action's current content draft, for accounts with content pull requests, as the member who created the API key or authorized this connection; they must manage this project. The page belongs to the content source with the longest matching URL prefix (see devtune_get_content_sources), and the source's provider decides which. A refresh draft's section edits are applied to the page: each change's current text is replaced, matched after collapsing whitespace, and each new section is added after its heading. If any change does not match, nothing is written and the refusal is draft_does_not_match_source with the change numbers. A create draft becomes a new page named from the brief's target. On GitHub, DevTune commits to its own branch, devtune/action-, and opens the pull request. On GitBook, DevTune opens a change request whose description names who approved the draft, writes the page, and checks GitBook stored it as written (page_not_preserved if not). DevTune never merges either. One per action: calling again with a newer draft updates the open one. Pass draftId (the current version from devtune_get_action_draft) so a draft replaced meanwhile is refused with draft_not_latest. When no source covers the page, the refusal is no_content_source with details.sources; retry with sourceId. When the page is not found, the refusal is file_not_found with details.tried; retry with filePath (GitHub) or pagePath (GitBook). Other refusals: unavailable, no_draft, action_closed (live or archived), page_locked, source_needs_reconnect, invalid_file_path, file_exists, branch_diverged (someone else pushed to DevTune's branch; DevTune leaves their commits alone), change_request_diverged (someone else edited the change request; DevTune leaves their edits alone), change_request_conflicts (the change request has conflicts in GitBook), page_not_preserved, pull_request_in_progress, pull_request_merged, github_error and gitbook_error (details.detail is rate_limited when GitBook's rate limit for the connection is used up, recovery_incomplete when DevTune could not finish looking for a change request an earlier attempt may have opened, or recovery_stale when another attempt for the action finished while this one started; retry later). Returns the pull request: provider, state, number, url, repository and branch (GitHub) or space (GitBook), filePath (the GitBook page path for GitBook), draftId, updateFailure (a failed update beside an open change request), checkedAt (when DevTune last read a GitBook change request in GitBook; null for GitHub) and timestamps.
Inputs: actionId (required), draftId, filePath, pagePath, +1 more.
devtune_create_prompt_actionAIdempotentInspect
Create or reuse an action from a tracked prompt. Only set generateBrief when the customer requests metered brief generation (reserves 2 credits). Saves the action even when brief generation fails. Does not publish content.
Inputs: title (required), promptId (required), description (required), targetUrl, +2 more.
devtune_create_webhookAInspect
Create a project webhook for supported events at a public HTTPS endpoint. Requires webhooks.write. Returns its signing secret once; store it securely. No automatic retries.
Inputs: url (required), events (required).
devtune_decide_dex_handoffBDestructiveInspect
Confirm or cancel one pending specialist-agent handoff in a Dex conversation.
Inputs: decision (required), threadId (required), handoffId (required).
devtune_decide_dex_memoryBDestructiveIdempotentInspect
Save or dismiss one durable memory offer from a Dex conversation. Saves verify the text against the persisted agent event.
Inputs: taskId (required), offerId (required), decision (required), threadId (required), +1 more.
devtune_delete_dex_threadADestructiveIdempotentInspect
Delete your private Dex chat after stopping its live run. Billing and audit records are retained. Requires a user-attributed API key owned by the chat creator.
Inputs: threadId (required).
devtune_delete_webhookADestructiveIdempotentInspect
Deactivate a project webhook. Returns {deleted:true}, including for an already inactive subscription. Unknown or foreign IDs return not_found. Requires webhooks.write. No automatic retries.
Inputs: webhookId (required).
devtune_disable_agent_picks_scheduleADestructiveIdempotentInspect
Turn the project test schedule off. Future scheduled tests stop; a test already queued or running continues until cancelled with devtune_cancel_agent_picks_test. Works while the account is paused. Requires actions.write and Agent Picks. The OAuth member, or the member who created the API key, needs project management rights.
Inputs: setup.
devtune_draft_agent_picks_jobAInspect
Draft a custom Agent Picks job from the project's product: the requests agents are given (add, recommend, hosted), the building blocks that decide built_its_own and no_provider, and competitor suggestions, plus the job line when job is null. A draft is a proposal; nothing reaches a test until devtune_save_agent_picks_job saves it. Drafts share the project's allowance of 60 an hour with the app, drafts still running included (rate_limited when spent). Returns draft_id, status (drafted or failed), job, requests, building_blocks, competitors and rejected proposals. Refused while the account is paused. Requires actions.write and Agent Picks. The OAuth member, or the member who created the API key, needs project management rights.
Inputs: job.
devtune_draft_agent_picks_toolAInspect
Draft one tool's signals for a custom Agent Picks job from package registries and its own site: the packages, config names, import patterns, config files, config patterns and domains that name it in a run. Pass tool_key, name, domain (or null) and the job line, and other_tools (tool_key and name of the job's other tools) to have the draft propose which of them run inside one another. Shares the project's 60-an-hour draft allowance with the app (rate_limited when spent). Returns draft_id, status, tool_key, signals, relationships, sources, rejected and failure. Each relationship (tool_key, yields_to, quote, url) is a proposal read from the drafted tool's own site, never registry text: tool_key, another of the job's tools, yields to yields_to, the drafted tool, so a run that uses both counts as yields_to; quote is the sentence that says so and url the page. Apply one by adding yields_to to that tool's signals.yieldsTo. Pass the draft's signals and draft_id in devtune_save_agent_picks_job. Refused while the account is paused. Requires actions.write and Agent Picks. The OAuth member, or the member who created the API key, needs project management rights.
Inputs: job (required), name (required), tool_key (required), domain, +1 more.
devtune_generate_action_briefAIdempotentInspect
Trigger brief generation for a specific action. Returns whether the brief was already ready or has been queued or is already generating in the background.
Inputs: actionId (required), briefStyle.
devtune_get_404_demandARead-onlyIdempotentInspect
Get project-scoped 404 Demand for one published window, separated into credible content-intent clusters and likely scanner or technical noise, with materialization state, machine-traffic sensor coverage, and inferred project relevance. windowDays 30 (default) is the window opportunities and actions use; 7 is mined from the same run over the last seven days, so its clusters, counts and ranking are its own. window gives the selected start and end dates and asOf, when the run that mined the clusters finished. window.coverage is read live when you call, with its own observedAt: coveredDays counts the days a crawler sensor that reports status codes recorded machine traffic. Hours recorded after asOf can raise it while the clusters stay as mined, so do not treat the two as one snapshot. Fewer covered days than windowDays means part of the window is unmeasured, not free of 404s. A null window with dataAvailability degraded means that window is not published, including after a failed run, which state still reports. Clusters prioritize project fit before request volume; unrelated demand remains visible but is excluded from automatic action suggestions. Optional hosts list each cluster's request counts for the 20 busiest request hosts across the window; a null host counts requests whose host is unknown or outside those hosts. When the window includes 404s from a source that reports page views only and cannot verify requests, the response names that source, its hosts and the qualifiers, and each cluster lists which of its hosts they came from; provenance with state unavailable means that could not be checked.
Inputs: windowDays.
devtune_get_accuracyARead-onlyIdempotentInspect
Read Accuracy over 30 or 90 days: how many claims AI answers made about the product were checked against its own site, and how each came out. totals counts facts (claims checked) by outcome: match, contradict (the answer disagrees with the site), site_conflict (the site disagrees with itself), not_on_site (the site does not say), stale, unjudged and dismissed; match_rate is null when nothing was judged. totals.contradict counts contradicted claim groups (distinct AI wordings); contradiction_rows counts the site sentences they contradict, as devtune_list_accuracy_contradictions lists them, and prior_contradiction_rows the same count for the previous window when it compares. unquoted_contradictions counts contradictions whose claim quotes no sentence of the site, which no contradiction row lists. prior_status says whether the previous window of the same length (prior_window) compares: when it is comparable, prior_totals holds its totals, so report the change; when it is incomplete or method_changed, prior_totals is null and no change should be stated. method_changed includes different question or sampling versions, or mixed sampling within either window; sampling_versions lists 1 for one answer per prompt/platform/week and 2 for up to three. weekly gives the trend by Monday-UTC week, with per-week sampling_versions retaining both methods in mixed weeks; empty means unknown. A week with sampled answers but no checked facts has facts 0 and a null match_rate. A sampling change can explain a jump in coverage. platforms gives the per-platform split, where a claim seen on several platforms counts on each. coverage counts the answers eligible, sampled, checked, with no claims, failed and pending; when facts is zero, pending answers mean the checks have not finished, not that the answers were accurate. series_started_on is null until the first answer is sampled.
Inputs: intent, window, platform.
devtune_get_accuracy_claimARead-onlyIdempotentInspect
Read one Accuracy claim group (groupId, the group_id from devtune_list_accuracy_claims) over the same window and filters: the claim, its outcome, the platforms and number of answers that made it, the latest answer with the site page, any other page and the evidence it was judged against, up to 20 other answers, the brand's own pages the answers cited with how many cite each, and the team's active decision. outcome and claim are null when the group made no answer in the window and filters. A group id outside the project is refused.
Inputs: groupId (required), intent, window, platform.
devtune_get_accuracy_contradictionARead-onlyIdempotentInspect
Read one Accuracy contradiction row (sentenceKey, the sentence_key from devtune_list_accuracy_contradictions or from a contradiction in devtune_list_accuracy_claims) over the same window and filters: the site sentence and its page, the row's counts, platforms and open action, and every AI wording that contradicts it, active ones first, each with its answers, platforms, latest contradicting answer excerpt and prompt, and the decision that dismissed it. wordings is empty and site_page null when the row has no wording in the window and filters. A malformed key is refused.
Inputs: sentenceKey (required), intent, window, platform.
devtune_get_action_briefARead-onlyIdempotentInspect
Get the stored brief for a specific action, including readiness status, whether research was cut short, settled credits used, generated timestamp, and the brief when one is ready. briefFormat 2 briefs return briefMarkdown (the brief, then an Evidence section that is context, not specification) plus the structured brief (task, outline, facts with sources, each project or external fact carrying sourceRef, the supplied project data ref or source packet URL it restates, and sections, the zero-based indexes of the outline sections that use it; briefs written before refs or sections omit them; leaveOut, rules, doneWhen) and evidence objects; a draft states only product facts on the facts list. The optional inboundLinkPlan names up to three related-page edits with source sections, excerpts, suggested anchors, a target and a pinned crawl generation. edgeStatus not_observed_in_generation is a suggestion based on that generation, not a measured missing or live link. Current locked or retiring source and target pages have their edits removed on read. Stale or unverifiable current brief inputs omit the plan while preserving the stored target brief. The single-page drafter leaves related edits outstanding for human approval and a fresh crawl. briefFormat 1 briefs return Markdown only and cannot be drafted from until regenerated. When claim checks are enabled for the project and one has run, claimCheck reports how the brief's facts (or, for a format 1 brief, its claim references) held up against the project's owned content, searched for each claim: coverage (claims checked, claims whose owned-content search failed, and claims set aside by source type) and a judgment per claim with its source (a site page with its URL, the project profile, DevTune's own analysis, an external source, or general knowledge), the pages a claim that is not supported was judged against and the quoted passage for a confirmed contradiction. It annotates the brief and never changes it. robotsTxtDraft carries the action's drafted robots.txt edit, or null: per robots.txt file, the edited file and a unified diff (at most 16 KB) that add only the narrowest Allow rules, drafted from the file the audit read, or a no_change or unavailable status with its reason. An allow with match exact_page opens only that sampled page, not everything the blocking rule covers; widening it is the customer's call. A sampled page that redirects is never drafted, its first hop included: it is listed in skipped with reason redirected and the sampled page URL. Every read re-checks a stored draft against the current acknowledgements and primary domains: it comes back unavailable with reason out_of_date when it would change an acknowledged URL, check_unavailable when that check could not run (try again), too_large_to_check when it is too large to check, or an ownership reason when its host is not itself a primary domain (ownership is exact-host only). A robots.txt reached through a redirect, from either side, is never drafted (robots_redirected). If the project has any acknowledged restriction for a crawler scope, no edit is drafted or shown for that crawler (acknowledged_scope). A human applies it.
Inputs: actionId (required).
devtune_get_action_draftBRead-onlyIdempotentInspect
Get an action's content draft, for accounts with content drafts. draftKind is the draft the action takes now: page (the Page Drafter writes a whole new page for a create action) or section_edits (the Section Editor writes a change list for a refresh action), with agentKey naming the agent; both are null for an action that takes no draft. briefState says whether its brief is ready (outdated: written before the current brief format, so it must be regenerated to draft), and targetPage, for section edits, is the page edited (the action's own target, else its ready brief's page on an owned domain), whether it is locked, and briefRecommendedUrl when the brief recommends a different page. models lists the models a run can use with each one's per-run credit estimate. run is the draft run in flight, or the last one that ended without a draft. versions lists the current draft and up to 10 earlier versions, newest first: each has its draftKind, title, contentMarkdown (the page, or the change list rendered as markdown), changeList for section edits (each change's heading, current text, proposed text and reason), status (current for the draft the action shows, superseded otherwise), timestamps, briefId and runId, and factCheck: its status (checked, partial or unavailable), the sentences still flagged, each with its reason (unsupported or contradicted by the customer's own site, not_in_brief: a product fact the brief's facts list does not state, with siteJudgment saying whether the site states it, contradicted_by_source: a claim about another product that an external fact on the brief's facts list contradicts, with that fact as the brief words it and the source it cites, or competitor_link: the sentence links to one of the project's configured competitors, with the link in linkUrl) and the pages it was judged against and any contradicting quote, how many were flagged before and after the agent's fix pass, and coverage: how many sentences the check reviewed as possible claims (questions and short fragments are not counted), and of those how many were settled (restated from the brief's facts list, judged against the site, or contradicted by a source on the brief's facts list), unsettled, not checked, third-party claims (about another product, company, standard or source) read but not verified (notVerified), set aside as guidance, examples, headings or opinion, or marked [Needs source], with hasGap true when any were not judged and settled. current is the current version. pullRequest, for accounts with content pull requests, is the pull request opened from the draft (state opening, open, merged, closed or failed, with number, url, repository, branch, filePath, the draftId it carries, trigger (auto when DevTune opened it for a new draft because the content source has automatic pull requests on) and any failure, whose code for an automatic attempt can also be source_needs_reconnect, file_not_found (filePath null), file_exists or draft_does_not_match_source, and checkedAt, when DevTune last read a GitBook change request in GitBook), or null. Drafts are never published by DevTune.
Inputs: actionId (required).
devtune_get_action_eventsARead-onlyIdempotentInspect
List who changed an action's title, owner, channels, description or published pages, newest first. Each event has a kind (renamed, owner_set, owner_cleared, channels_changed, description_changed, published_page_added or published_page_removed), from and to values (owners as user ids, channels as arrays, pages as URLs), the actor (a user with their id and name while they are still a member, an api_key with its key id, or system for DevTune) and createdAt. Lifecycle moves such as accepting, going live or archiving are not events; read them from devtune_get_actions. History starts when recording began, so older edits are not listed. Pass nextCursor back as cursor for the next page.
Inputs: actionId (required), limit, cursor, pageSize.
devtune_get_actionsBRead-onlyIdempotentInspect
Get the actions for a project. status is suggested (DevTune proposed it, nobody has decided), accepted (the team wants it done), live (the page is published and its measurement window is open) or archived (taken off the queue by the team); blocked is true on accepted work the team has marked blocked. Suggested actions expose the same nullable opportunity percentile, percentileStatus and percentileScope as REST (signal_family compares like signals; families are interleaved), Reach, Gap, Confidence, family (including citation defence), estimated state, measured facts, and locked-page steering source. A null percentile carries percentileStatus insufficient_reach when reach is null, sensor coverage is absent, or estimated reach is zero. It carries percentileStatus no_measured_gap when every product in the family is zero and reach is non-null and not estimated-zero. Numeric percentiles omit the status. percentilePoolSize counts rankable candidates in the full family before selection or pagination. A size of one means Only ranked opportunity of this type, never Top 1%. Older records omit the pool size; do not infer singleton status from percentile 100 or the returned page. Positive-product candidates are seated before zero-product candidates. Citation-defence normalization is matched_cohort_executions when the cohort rollup is published or window_executions when the matched cohort is not published yet. Both compare citations per successful prompt execution; matched-cohort loss reports one-window-only composition changes and states matched coverage of earlier citations. Suggested actions come first and follow persisted portfolioRank ascending, nulls last, and no action exposes a legacy scalar score. Context detail includes interventionExplanation, the same stored page decision as the app and REST, or null for legacy/manual rows without a shape. It includes selectedMove, buyerQuestions, source, auditFindings, nearby alternative and reason, limitations, protectedPageUrls and human_review_required approval. A recorded question can have null retained text; this does not mean no question was tracked. Refactor reorganizes an existing answer; enrich adds missing or outdated detail, both using refresh storage. Read stored_snapshot as unvalidated against current pages/questions, even for accepted, live or restored actions. Retargeting and consolidation are not selected moves: the stored evidence does not establish a new target question or justify combining pages. Limitations report only gaps relevant to the action; Creation is the stored choice, not a measurement that no existing page fits. Preserve unique facts and distinct intent; never delete pages or change protected pages. No edits, redirects or relinks have executed. Context metrics may include ownedPageMatches (at most forty) and ownedPageMatchCount (total retained checks). A no_match covers only the at-most-twelve-page shortlist; coverageIssues records unjudged inventory limits and source failures. It never proves that no page exists elsewhere. An incomplete check is not negative evidence, and checkedAt is omitted for an unstarted or undated check. Context detail includes topEvidence.redirectTargets for missing-page demand: up to three existing same-site URL and title candidates to check before redirecting, or an empty list. Candidates never change the action rank. Context detail includes bounded audit assessment dates, factor checks and prompt-coverage limits, plus structured Google eligibility dimensions when entitled live evidence is available. Every action carries assignedTo (its owner's user id, null when unassigned) and ownerName; change either with devtune_update_action. followUpOf (actionId, title, shippedAt) names the earlier action that shipped this page, null when there is none; read its result from the outcomes ledger. The intervention explanation records the original stored recommendation; current brief motion and the offered drafter take precedence when the brief chooses another approach. Question and Audit-finding lists disclose truncation through buyer_questions_truncated and audit_findings_truncated limitations. Context detail lists mergedSuggestions (label, mergedAt, confidence): reworded suggestions the duplicate check merged into the action as the same fix, hidden from the queue while the action holds its decision. Splitting one back out is done on the action's page in the app; this tool cannot split. Context detail includes robotsTxtDraftSummary for an Audit-finding action whose robots.txt blocks an answer engine or AI search crawler: whether an edit was drafted, the crawler tokens it unblocks and when the audit read the file, or null. Read the edited file and diff with devtune_get_action_brief. A human applies the edit; nothing has been applied, and training crawlers are never unblocked.
Inputs: page, limit, cursor, source, +6 more.
devtune_get_adoption_metricsBRead-onlyIdempotentInspect
Get SDK/package adoption trends including npm weekly downloads and GitHub stars over time. Tracks adoption for your primary domain and competitors.
Inputs: metric, windowDays.
devtune_get_agent_picks_actionsBRead-onlyIdempotentInspect
Read a page of the setup’s Agent Picks Actions (limit or pageSize, default and maximum 100), or the one actionId names whichever setup it belongs to, with rendered titles and descriptions, their loss rationale, baseline cell pick rate (every run that picked the tool, a stated pick included; re-tests compare the same rate) and Wilson 90% range (a measurement with scenarios pools that many cells: rate averages each cell’s rate, counting each once, and its range counts cells, so picks and runs are counts beside it, not its fraction), latest paid re-test status and credit accounting, and the measured Outcomes result with its method: v2 results decide each cell by the 90% interval on the difference from its baseline and show 90% ranges; v1 results, from re-tests started before v2, compare 95% ranges and show them. Report a result’s ranges at its method’s confidence, and say when results you compare used different methods. With actions.read, an Action with a current drafted fix carries agent_prompt, the fix as a Markdown prompt for a coding agent that names the locked pages it steers around; it publishes nothing. Reason Actions expose the actual fetch URL/status, classifier key or own-tool observation (own_url_failed, own_install_failed, own_tool_not_observed, own_tool_tried) and every covered cell, with aggregate evidence rather than a first-cell claim; observation Actions add observation_counts, a docs coverage result on own_tool_not_observed, the most common trails on own_tool_tried (what runs did with the own tool, in order, before picking another or building their own), the winners of each cell and failures on other sites by URL origin, while rates and re-tests stay on full-cell baselines. Pass pagination.nextCursor as cursor while pagination.hasMore; next_offset is deprecated. A page of exactly 100 rows reports more even when it is the last, so the following page can be empty. Incomplete coverage is explicit. Shipping alone is unmeasured; only queued or running re-tests are still_measuring; no modelled wins. Re-tests are estimated and confirmed in the app. Requires Agent Picks and visibility.read.
Inputs: limit, setup, cursor, offset, +2 more.
devtune_get_agent_picks_cellsARead-onlyIdempotentInspect
Read per-model cells for 1 to 8 distinct project-owned tests from test history. Returns coverage, the shared loss verdict and own-led status with each cell’s decision_method, the rule that decided them (v2: a clear difference at 90%; v1, also when missing: raw counts, a top rival or built its own with no own majority is a loss; no_provider never wins a loss and unmatched-code guesses are left out), fallback guesses and none/unclassified/other-tool run counts, plus per-tool picks, pick rates and Wilson ranges, with stated_picks, installs and the install rate and range beside each pick rate (null for built_its_own and no_provider). Each test’s install_rate_hidden_reason is no_installable_tool when none of the test’s tools has a package, config name or import pattern to install (a hosted dashboard): every install_rate is then null, not 0; report the pick rate alone and say why. Each test includes status. Non-completed tests retain coverage only: tools are unmeasured and measurement counts, rates, ranges and verdicts are null. Each test includes judging_key and comparison_key for its classifier version, stated-pick policy, category, resolved own tool, sorted distinct competitor keys and recorded requests, request ending, job line and job signals. With no recorded request metadata, the key still covers category_id and resolved tool roles. Use equal complete keys for pairwise deltas. Retain each test’s measured trend points and break lines at judging changes. projects_added and projects_removed list the test apps (id, slug, name, framework) the test added and removed against the full test before it: show them as an event on the trend without breaking the line; cells still compare per test app. requests_changed lists each request (intent, before, after) the test reworded, left out (after null) or asked again (before null) against that test, and ending_changed the request ending before and after (null when unchanged): show each as an event on the trend without breaking the line; cells across either have different comparison keys. Each test includes outcome_counts_available; its outcome counts are null when completed run detail is unavailable. Each test and cell also includes runs_without_trail, the completed runs that recorded no trail event (null where trail coverage cannot be determined, as for a cloned public test; never read null as 0). Each cell includes discovery: completed_runs, reached_runs (the trail searched for, fetched or installed the own tool: its docs, package or registry entry), unavailable_runs (no trail to decide from, left out of the rate), and rate with rate_low and rate_high, the Wilson 90% range. Report it beside the pick rate: a loss with a low discovery rate means agents never found the tool; a high one means they found it and still chose another. discovery is null when the test has no discovery measurement (finished before it was recorded, no own tool, or not completed): say it is unavailable, never 0. Model-side web search and fetch bypass the sandbox, so not reached means not seen in the sandbox. Unmeasured tools have measured false and null rates. Completed counts and displayed rates include fallback guesses; loss verdicts exclude them. Each cell tool also includes found, the cell’s Found in with the same fields as discovery, for every tool the test recorded: report it with its counts beside the pick rate, never as a pick. found is null for built_its_own, no_provider, a tool the test did not record and a test with no Found in measurement: report Unmeasured, never 0. Each test includes integration (null until it completes, and null when not computed for every install; an empty tools list only when nothing was installed): per installed tool, and per agent when the test ran more than one, how often install runs (stated picks excluded) had an observed package version, matched the registry latest pinned at queue time, used a deprecated version, requested vendor docs and ran the package’s commands. Each rate has numerator, denominator and unknown; report all three, never treat unknown as no, and report no_snapshot as no pinned registry data rather than a version verdict. Malformed and unavailable observations are counted, not included. Requires Agent Picks and visibility.read.
Inputs: test_ids (required).
devtune_get_agent_picks_historyARead-onlyIdempotentInspect
Read a page of the setup’s paid tests, newest first (limit or pageSize, default and maximum 100), or only the test test_id names, whichever setup it belongs to, with completion coverage and the project tool’s pick rate (rate, every run that picked it, a stated pick included, each scenario’s rate averaged over the test’s scenarios, which scenarios counts) and, beside it, stated_picks, installs and install_rate, from rollups, each with Wilson 90% likely ranges over the scenarios. picks and installs are run counts, not the rate’s fraction. rate_directional is true when the rate rests on fewer than 10 scenarios (one scenario: fewer than 10 runs): say the rate is directional. It is separate from directional, which marks how the test was run. install_rate_hidden_reason is no_installable_tool when none of the test’s tools has a package, config name or import pattern to install (a hosted dashboard): every install_rate is then null, not 0; report the pick rate alone and say why. directional=true marks partial matrices, cell re-runs, re-tests, starter tests and tests with fewer than three runs per cell. Keep those off full-test trends. Action and re-test baseline selectors exclude them. type is how the test was run: full, quick, custom or retest. settled_micros is what it has charged so far (1 credit = 1000000 micros), final once it ends. trend_eligible marks completed full tests in the current category. judging_key identifies classifier version plus stated-pick policy (absent, empty or unreadable policy means rules). Null means judging is unavailable. baseline_eligible additionally requires the latest full test’s known judging key. judging_changed marks a boundary from the preceding full test before pagination. Retain historical points but visibly break the line at every judging change, including a return to an earlier policy. projects_added and projects_removed list the test apps (id, slug, name, framework) the test added and removed against that test, empty for a directional test or re-test: show them as an event on the trend without breaking the line. requests_changed lists each request (intent, before, after) it reworded, left out (after null) or asked again (before null) against that test, and ending_changed the request ending before and after (null when unchanged): events on the trend, never breaks. A recognition edit on a setup of confirmed tools changes judging_key, so it breaks the line. Compare equal non-null judging keys only; intervening tests with different judging do not make two matching tests ineligible. open_loss_actions counts the loss Actions the test created that are still suggested or accepted. action_id is the Action a re-test measures, null otherwise. Pass pagination.nextCursor as cursor while pagination.hasMore for earlier tests; next_offset is deprecated. A page of exactly 100 rows reports more even when it is the last, so the following page can be empty. Unfinished tests have no rate. Requires Agent Picks and visibility.read.
Inputs: limit, setup, cursor, offset, +2 more.
devtune_get_agent_picks_runARead-onlyIdempotentInspect
Inspect one project-owned Agent Picks run with test_id and run_id from the run list. Returns status, stage and live model activity (cell_agreed=true: cancelled before it started because its cell’s first 4 runs agreed, not needed rather than an error, with has_error false), typed context, classified pick and an ordered page of retained observations by seq then id. Follow evidence.pagination.next_cursor until has_more is false; request and job are null with request_withheld and job_withheld distinguishing withheld snapshots from absent ones, null pick means no recorded classification, optional pick.statement_index locates the deciding sentence without exposing its quote or consistency fingerprint, pick.classifier_accuracy is how often the classifier version that judged the run was right on a labelled test set, not on production runs: precision per outcome kind, the unclassified rate and stated-pick recall, each as rate with count of of; it is null for a version with no labelled figures or a job test judged by Jev, and a precision kind is null when never reported on the set, pick.category_precision is how often that version was right in the run’s category on a hand-labelled sample of DevTune’s own published test runs, not on your runs: precision per outcome kind (installed, built_its_own, no_provider, none) as rate with count of of, where rate is null when of is below minimum_reported, too few to state a rate; it is null for a category or version with no labelled sample, other_tools is empty with other_tools_withheld marking withheld runtime names, pick.overlapping_tools names the test’s tools an ambiguous run used (tool_key, display_name; empty otherwise) and pick.custom_job says whether the test is the project’s own job and still its setup, where saying which tool runs inside the other (signals.yieldsTo, saved with devtune_save_agent_picks_job) decides such runs in later tests, and not_retained means no event rows are retained, including before a running run records them. Commands, error text, raw provider prompts and Storage artifacts are withheld; URLs show only their HTTP origin. Arbitrary request/job/search/file text is withheld; text_withheld marks search and file details. Packages must match the configured tool catalog and packages_withheld marks omitted names. integration.packages[].registry reports the queue-time registry snapshot for each observed package: latest_version, comparison, version-specific npm deprecated, comparison_reason, deprecation_reason, source and captured_at. Scheduled project tests and DevTune board tests capture registry metadata; new on-demand tests, free starter tests and Action re-tests do not capture it and registry comparison/deprecation remain unknown with no_snapshot. Previously retained snapshots are preserved. A comparison of differs does not mean outdated. Missing snapshots, wildcard names, unavailable or unsupported registries, malformed responses, redirects, timeouts, not_found lookups, unknown gem lookup spelling (lookup_identity_unknown), capture limits, missing observed versions and versions absent from captured metadata remain explicit unknowns; non-npm deprecation data is unsupported, and yanked does not mean deprecated. Installer output and archive downloads remain distinct evidence. Observations do not prove causes or a working integration. Requires Agent Picks and visibility.read. Cannot change or start a run.
Inputs: run_id (required), test_id (required), limit, cursor, +1 more.
devtune_get_agent_picks_run_traceARead-onlyIdempotentInspect
Read one page of a project-owned Agent Picks run's console trace: redacted prompt, setup, narration, tool calls and results, file edits and errors, ordered by attempt then seq. An attempt's lines are available once that attempt finishes; a running attempt has none yet, and an attempt whose transcript could not be read has one error line, Trace unavailable for this attempt. availability is stored, pending (none yet: the run is running or finished within the last hour) or not_retained (none expected: it finished over an hour ago, as every run before traces were kept did), and attempts marks each attempt stored or not. When present, attempts.recovery is pending while trace recovery continues, stored after it completes, or unavailable after it gives up. Recovery can continue beyond the initial hour. A model_call item follows the first line of its attempt carrying its provider response id, else a tool-call id, with its token counts. Calls that match no line are in unplaced with a reason (failed, no_ids, pending or unmatched), 200 at a time: the first page (cursor 0, 0) carries the first 200, and passing unplaced_pagination.after_id as after_unplaced returns the next 200; Codex reports no ids, so its calls are never placed. totals counts every proxy call. Each line carries preview, its first 65,536 characters, with preview_truncated when the stored text is longer; to read one line's whole stored text (up to 1 MiB, detail.truncated beyond), pass after_attempt, after_seq one before the line, limit 1 and full true. Pass pagination.after_attempt and after_seq back until has_more is false. limit defaults to 50, maximum 100; a page also stops after 256 KiB of lines. Requires Agent Picks and visibility.read. Cannot change a run.
Inputs: run_id (required), full, limit, after_seq, +2 more.
devtune_get_agent_picks_scheduleARead-onlyIdempotentInspect
Read the project test cadence, next UTC run, newest skipped period with reason, action and action_href, and the current paid-test estimate per run and for the next calendar month against plan credits. Every plan can schedule. Requires Agent Picks and visibility.read. last_skipped is null when the cadence is off or the newest period was not skipped. Reasons include insufficient_credits, permission_changed, no_settings, estimate_changed and agent_not_in_plan (the Agent Picks plan of the account includes none of the saved agents; action view_plans links to billing); follow action_href to recover. test_in_flight and unavailable have null action and action_href because nothing needs fixing. Read this estimate before setting a schedule.
Inputs: setup.
devtune_get_agent_picks_starter_testARead-onlyIdempotentInspect
Read the project's Agent Picks starter test as it runs, run by run. test is the project's latest starter test, or null when it has none (then runs and tools are empty). test.status is queued, running, completed, failed or cancelled; planned_runs counts the runs it queued and completed_runs those with status completed. A failed or cancelled test keeps its runs, so report what its completed runs picked and that the rest did not finish. Each run gives the request it was given (intent add = build it, recommend = recommend one, hosted = hosted service, and request the text), its agent and model, its status, and sandbox_attempts, the sandboxes it started. outcome is null until the run is classified, then installed (tool_key names the tool), built_its_own (the agent wrote its own), no_provider (wired in a hosted service without naming a provider), other_tool (other_tools lists the packages and hosts it added that no tool in the test names), none or unclassified. tools lists the tools the test ran with and gives the display name for each tool_key; it is null for a test queued before tests recorded their tools, so do not report which tools such a test compared. stage is sandbox, setup, agent or judging while running, otherwise null, including older runs. During agent, model_calls reports proxy-recorded calls across attempts; null means no meter was recorded. These are live per-run results, not rates: for install rates with their likely ranges, read devtune_get_agent_picks_summary. It shows the latest completed non-directional own test first, otherwise the latest completed directional own test, including a starter. A starter never displaces a full own result or feeds loss Actions, re-test baselines or trends.
Inputs: no named parameters.
devtune_get_agent_picks_summaryBRead-onlyIdempotentInspect
Read Agent Picks: which tool coding agents (Claude Code, Codex, OpenCode, Pi, Muse Code) installed when asked to add one in the project's category, from install-verified test runs. test is the project's latest completed non-directional own test. If none exists, show its latest completed directional own test, including a starter, Quick, Custom subset or cell re-run, with test.directional=true. Only when neither exists use the category's public test: the copy cloned into the project (kind cloned), else the latest public test. Directional tests never displace a non-directional own result and never feed loss Actions, re-test baselines or full-test trends. test.scope is public for either, so say when the numbers are the public test. test.measured_pairs is present only when a public board test carried some scenarios over from an earlier edition instead of running them again: each agent and model pair's measured_from and measured_to, and its carried_scenarios and fresh_scenarios, so say which pairs were measured when and which were partly carried over ("Claude Code and Codex measured 8 Nov; Pi partly carried over, measured 8 to 9 Nov; OpenCode 9 Nov"). Re-tests are never shown. runs counts completed runs, and every rate uses completed runs only. coverage says how many of the planned runs (matching the filters) completed, failed (ran without completing) or were not run (the test reached its budget before they started): when completed is below planned, say so with the numbers, e.g. 418 of 432 runs completed. incomplete_cells lists each test app, question, agent and model cell where fewer runs completed than were planned; a cell with completed 0 was not measured, so report it as not measured, never as a 0% rate. Each tools item's rate is its pick rate: in each scenario (test app, request, agent and model), the runs that picked it (including a stated pick, where the agent named it as its choice without writing it into the code) over that scenario's completed runs, averaged over the scenarios so each scenario counts once however many runs it took. scenarios says how many, and rate_low and rate_high are the Wilson 90% likely range over them: report the range with the rate, and when directional is true (fewer than 10 scenarios) say the rate is directional. picks and runs are counts summed over the scenarios; picks / runs is not the rate, so never report them as a fraction of it. Call two tools different only when the 90% interval on the difference between their pick rates excludes zero, as Head-to-head decides a cell of a v2 test (test.decision_method, a public test's own method); a v1 test, and a missing method, decides its cells and losses by raw counts; two ranges can overlap while the difference is still clear (6 of 8 runs against 2 of 8). The pick rate is the headline. Beside it, stated_picks counts the stated picks, installs = picks - stated_picks the runs that wrote the tool into the code, and install_rate with install_rate_low and install_rate_high its install rate and range; never report the install rate instead of the pick rate. built_its_own and no_provider name no tool, so their installs and install rates are null. install_rate_hidden_reason is no_installable_tool when none of the test's tools has a package, config name or import pattern to install (a hosted dashboard): every install_rate is then null, not 0; report the pick rate alone and say why. outcome says what each item counts: installed (tool_key names the tool), built_its_own (the agent wrote its own instead of installing a tool) or no_provider (the agent wired in a hosted service, such as a database or mail server URL the user fills in, without naming a provider); the last two have tool_key null. Report built_its_own and no_provider separately, never as one figure, and never count either as a tool's loss to the other. is_own marks the project's own tool and is_competitor its competitors; both always list, at zero picks when no agent picked them. frameworks gives each framework's runs and top picks (framework null is the empty folder); agents gives each agent and model's rates for the same tools, in the same order. environments gives each test app (slug, name, framework) with its runs and picked tools, its rates per agent (models summed), and cells: one per question the test asked (intent add = build it, recommend = recommend one, hosted = hosted service, asked only where the category has a hosted option, improve = improve existing, asked only where the category has an improve request and only in test apps that start with one of its tools) and agent, each with its coverage; each group lists the tools picked there plus the project's own tool. A cell or test app where no run completed has runs 0 and no tools. Pass agent and/or intent to narrow every number to those runs; filters echoes what was applied. own_tool_key and competitor_tool_keys are the shown test's snapshotted roles. Older tests fall back to current settings, constrained to recorded job tools when present; test.roles_source is snapshot, job_signals or current_settings and the latter two use current settings. enabled_environment_ids, enabled_frameworks, enabled_agents and enabled_agent_models are the project's current setup; an empty list means it is not chosen yet. status no_settings means no category or job is chosen yet and no_test that no test has finished, so there are no rates to report. job is set when the project tests its own job instead of a public category: job.job is the work agents are asked to do, job.requests the requests its tests give them, job.tools the tools it compares (is_own marks the project's) with the packages, config names, import patterns and domains that name each one in a run, and job.building_blocks what decides built_its_own and no_provider; an agent drafted them and the customer confirmed them. When a test is shown, job.job, job.requests, job.tools and job.building_blocks are as that test recorded them when it was queued, so they describe the numbers even after the job is edited. A job has no public test, so its numbers are always the project's own, and category is then the job's own (a slug starting job-, name the job line). A job test's run that added a package or hosted service no confirmed tool names counts in every rate's denominator but in no tool's picks. Pass test_id (from devtune_get_agent_picks_history) to read one completed test instead of the shown one, through the setup that now holds the category it recorded, which setup echoes; a removed setup's test is read through the category it recorded, with the roles it recorded, and setup is null. A re-test, unfinished test or another project's test is not found. open_loss_actions counts the setup's loss Actions still suggested or accepted, whatever the filters. Every rate also carries found, Found in over the same runs: completed_runs, reached_runs (the trail searched for the tool, fetched its site or a package of it, or tried to install it), unavailable_runs (no trail to decide from, left out) and rate with its Wilson 90% range. found.scenarios counts the scenarios it averages, like the pick rate: in one scenario report it with its counts ("found in 6 of 8 runs"), over several report the rate and the scenarios, never the summed runs as its fraction. A tool found often and rarely picked is one agents passed over. It never counts as a pick. found is null for built_its_own, no_provider and where the test has no Found in measurement: report Unmeasured, never 0. copied_from names the public category the setup was copied from (category_id, slug, name), null for a blank setup. edited says whether the customer has edited the setup as it stands now: requests (a request, the request ending or a context) and recognition (how tools are recognized); null for no setup. public_board counts the cells of a full test that compare with copied_from's latest public edition (comparable_cells of total_cells): the shown test when it is a full test, else the setup's latest fast-track copy. reasons name what differs from the board in the rest, not who changed it: test_app: (the board does not run that test app), agent:: (the board does not run that agent and model), request: (the request text differs), ending (the request ending differs), recognition (how tools are recognized differs) and method (none of those differ, but DevTune's test itself does: classifier, stated-pick policy, decision method or execution fingerprint, or the board has no cell for that intent). public_board.board_rank is the board's own ranking of that edition, as the public leaderboard numbers its rows: every row in pick-rate order, Built its own and no provider included. own_rank is the setup's own tool's row from 1 (null when it has none or the board does not list it), and leader the first row (outcome installed with tool_key and display_name, or built_its_own or no_provider with both null; null when the board lists no row); board_rank is null when the edition could not be read. Say the setup ranks on the public board only when comparable_cells is at least 1; otherwise name the leader as the board's, without implying the setup's test measured it. public_board is null for a blank setup and when the category has no published edition.
Inputs: agent, setup, intent, test_id.
devtune_get_agent_picks_testARead-onlyIdempotentInspect
Read the project's latest paid Agent Picks test, or the paid test or re-test test_id names, with its status, estimate in credits, reserved_micros, settled_micros, refunded_micros, released_at and complete per-run table from its rollup. Pass test_id (from devtune_quote_agent_picks_test or devtune_start_agent_picks_test) to follow one test through cancellation and settlement after another starts; one that is not the project's paid test is not found. One credit is 1000000 micros. Failed runs and runs cancelled before they start are not charged; a run cancelled after it starts pays its recorded spend. cell_agreed=true marks a run cancelled before it started because its cell's first 4 runs picked the same thing: not needed, not an error or missing coverage, and not charged. Unused credits return when the test ends. Unknown spend on a completed run or a run cancelled after it starts charges the greater of recorded cost and the run's reservation share, capped by the remaining reservation. directional=true marks a partial matrix, a cell re-run, or fewer than three runs per cell, excluded from loss Actions, re-test baselines and full-test trends. Install rates are in devtune_get_agent_picks_summary for the latest completed non-directional own test, else the latest completed directional own test, else public results. Start tests with devtune_start_agent_picks_test.
Inputs: setup, test_id.
devtune_get_agent_runARead-onlyIdempotentInspect
Get one managed-agent run, including its draft output only after the run is complete. Superseded runs retain their output for reference; supersededByRunId names the replacing run. Retired action drafts appear under supersededActions.
Inputs: runId (required).
devtune_get_ai_referralsARead-onlyIdempotentInspect
Get complete paginated AI-referral landing pages (including engagement and page value), overview, and the complete engines breakdown with selected-provider sessions, distinct selected conversions, provider provenance, coverage gaps and native metrics for the same fixed window. Selected conversion events with no site visit, such as server-sent events, are reported as noSiteVisitOccurrences and are not coverage gaps. conversionDefinitions gives, per selected PostHog event or action that occurred in the same window (ones with no occurrences are omitted), occurrences with no site visit and occurrences tied to a site visit, with windowComplete; one with no site-visit occurrences in a complete window cannot be credited to AI. GA4 key events are omitted because they are always session-scoped. Also returns visitorShare: AI-referral sessions over all sessions from the selected analytics provider for the same window (0 to 1), whenever the provider imported every day and recorded sessions. Sessions that may be AI referrals but could not be traced (unknown source or site) are not counted as AI; unattributedSessions counts them and partial is true when there are any; priorShare appears only when both windows have a share, with priorPartial. With no provider, a day not imported or no sessions, the share is null with a reason, never 0. Also returns pageComparison: for each landing page in this page of results, engagement, bounce and conversion rates for AI-referral sessions against every other session on the same page over the same window. Rates appear only when status is compared, meaning the provider imported every day, no AI-referral session that could belong to the page is untraced, at most 2% of the page's other traffic is untraced (untracedShare gives the share on every compared page), and both sides have minimumSessions; otherwise reason says why (incomplete_import, needs_reauth, incomplete_attribution, too_few_ai_sessions, too_few_other_sessions). A compared page with no conversion rate has conversionReason no_key_events or incomplete_attribution. gap names a project-level gap (no_source, disconnected, needs_reauth, incomplete_import, no_key_events). Conversions with no site visit are left out of both sides and counted in noSiteVisitConversions. Sessions are not people; conversion rates are events per session. Missing provider measurements remain null.
Inputs: limit, cursor, pageSize, windowDays.
devtune_get_audit_extractionARead-onlyIdempotentInspect
Read DevTune's extracted content for one section finding on demand. Supply the domain, page path, contentHash, inputHash and locator from audit findings. Returns exact section source, nearby Markdown, source URL and separate extraction/assessment timestamps, or unavailable/stale. This is stored crawl output; it does not reproduce an AI platform renderer or verify unseen images.
Inputs: domain (required), locator (required), pagePath (required), inputHash (required), +1 more.
devtune_get_audit_findingsARead-onlyIdempotentInspect
Get audit findings and section assessments from the published Audit rollup, paged together from one shared offset: pagination.hasMore stays true while either has rows left, and the one that has run out returns an empty array on later pages. Section findings include exact excerpts, remedies, versions and coverage states; they do not change numerical scores.
Inputs: limit, cursor, offset, pageSize, +1 more.
devtune_get_audit_summaryARead-onlyIdempotentInspect
Get Audit summaries and independently bounded trends. trend.date is UTC for citations and answer fetches; clicksDate and priorClicksDate are Pacific GSC dates ending at the source boundary. Read current/prior coverage from searchConsole. When isCurrent is false, report partial last-published evidence with asOfDate and its original dates; do not call it current. GSC values are ranking evidence only for measured or verified_zero periods; report partial covered ranges and never pad GSC through UTC today.
Inputs: windowDays.
devtune_get_brand_sentimentARead-onlyIdempotentInspect
Get the sentiment of AI answers towards the project's primary brand over a fixed window of completed UTC days ending yesterday: overall and for each day, across every platform. Each answer that mentions the primary brand is scored from -1 to 1 for its stance towards that brand, never competitors. Sentiment uses an LLM scorer, or Jev where enabled, with LLM fallback when Jev abstains (below 0.5 confidence), fails, or is unavailable. Each answer counts once, including answers whose brand has since stopped being primary. There is no per-platform breakdown. averageScore is the mean score of scored answers; label applies the scorer's cut (above 0.3 positive, below -0.3 negative, otherwise neutral). positive, neutral and negative count scored answers. Days before 20 September 2026 are withheld: they were stored by an earlier version that scored a different subject and counted failed attempts. overall leaves withheld days out, window.dataFrom is the first day it counts and overall.coverage.daysWithheld how many days it left out; a withheld trend day has every figure null. averageScore and label are null when no answer was scored, never 0. coverage.responses counts answers in the window and coverage.scoredResponses those with a score; answers that do not mention the primary brand are never scored. Read coverage before comparing averages.
Inputs: windowDays.
devtune_get_citation_analysisARead-onlyIdempotentInspect
Backward-compatible alias for top citation pages in AI search results, with the same topicId, promptId and platform filters. Prefer devtune_get_top_citation_pages for new workflows. Returns the same coverage state: an unavailable window has not been rolled up yet, so an empty list is not a measured zero.
Inputs: cursor, search, topicId, pageSize, +3 more.
devtune_get_citation_statsARead-onlyIdempotentInspect
Get aggregate citation statistics for a project, including total citations, unique pages, unique domains, average position (null when no citation has a position), top-three count, and citation class totals. Returns a coverage state: an unavailable window has not been rolled up yet and carries no stats, which is not the same as a measured zero.
Inputs: windowDays.
devtune_get_code_mode_executionARead-onlyIdempotentInspect
Read operation receipts for one code-mode execution made by this same credential and project. Shows completed, rejected and uncertain operations without code, arguments or result data. A running receipt may survive a controller failure; never infer that its write did not happen. Reuse the original executionId and code in execute to retrieve its recorded response without repeating changes. Requires project.read and MCP code mode.
Inputs: executionId (required).
devtune_get_competitive_positionARead-onlyIdempotentInspect
Get competitive positioning data showing primary, competitor, and other citations. The default aggregates only currently active project platforms. shareOfVoice compares primary with competitor citations; primaryShareOfAllCitations also includes other citations. The shares are percents, null when their citations total 0, each with a sibling Range holding a 90% range as low and high in percent, successes and n counted in citations, and directional true when there are too few citations to rely on. totals cover every platform in the window; timeSeries leaves out platforms checked less often than daily (platformCadences with inDailySeries false, such as weekly Claude or Grok) unless they are the only platforms requested, in which case it has one point per run. platformCadences is null when cadence could not be read.
Inputs: topicId, grouping, platform, windowDays, +1 more.
devtune_get_connection_contextARead-onlyIdempotentInspect
Read which project this connection is bound to and what it can use now. Returns project id, name, paused and its own domains (domain and type), credential type (api_key or oauth), scopes and account features. scopes are what the credential may call at this moment: a paused project keeps only read scopes, and an OAuth connection keeps only what both the approved grant and the user's current team permissions allow. features are attributeMatch (Positioning and Accuracy), agentPicks (Agent Picks), contentDrafts (action drafts), mcpCodeMode and mcpCodeModeWrites. An operation needs its scope and, where it has one, its feature; neither bypasses human approval, credits or the operation's own checks, so a call can still be refused. checkedAt is when access was read. Available to every credential.
Inputs: no named parameters.
devtune_get_content_changesARead-onlyIdempotentInspect
List detected content changes, their manual claim tokens and measured-action IDs. existingMeasurementId links a page measurement completed within 14 days of the change without implying the change is claimed. Fixed reporting windows; 14-day comparisons. Path filters apply to list totals; summary covers the full window.
Inputs: path, limit, cursor, pageSize, +1 more.
devtune_get_content_gap_evidenceARead-onlyIdempotentInspect
Get the tracked prompts and cited pages behind one content gap from devtune_get_content_gaps. Pass its gapType and targetKey with the same windowDays. Evidence is published with the gap, so it covers the same fixed window and asOfDate. A source gap matches its URL, a brand gap the pages cited on its domain, and a topic gap every page cited in answers recorded under the topic. Each row groups one prompt, recorded topic, cited URL, recorded domain and sourceType, with its citation count and platforms. The same prompt and URL can appear in several rows when their recorded topic, domain or classification differs; pagination counts those groups, ordered by the prompt's citations of the gap. Counts are the gap's own citations split by the tracked prompt that produced them; attribution.attributedCitations falls short of the gap's citationCount only by citations no tracked prompt produced. Prompt text and topic names are current; promptStatus says whether the prompt is still tracked. Coverage is unavailable until the window is measured and its evidence published; a window publishes none when it includes days measured before evidence was recorded, holds more evidence than one publish includes, or had its gaps last recalculated from current topic and competitor settings rather than from the recorded citations. Pass pagination.nextCursor as cursor on later pages: it carries coverage.snapshotId, and a republished window returns snapshot_changed instead of mixing windows. A gap that is no longer in the window returns not_found.
Inputs: gapType (required), targetKey (required), limit, cursor, +4 more.
devtune_get_content_gapsARead-onlyIdempotentInspect
List measured topic, source, and brand content gaps from fixed 30/90-day rollups. Sources and brands the primary brand owns are excluded, as are topics the primary brand holds at least half the citations on, because those are presence rather than a gap. Every count is a citation split into primary and competitor; the rollups hold no mention facts. Coverage reports the covered-day count and the asOfDate the window ends on, so read the counts against availableDays rather than the requested window. Pipeline scores, generated summaries, prompt counts, and evidence are not part of this measurement contract. Pass pagination.nextCursor as cursor while pagination.hasMore. A cursor is bound to the publication its first page was read from. If a later page reads a newer publication, it returns conflict with reason snapshot_changed; restart from the first page without cursor. When restarting via REST after snapshot_changed, send Cache-Control: no-cache to bypass the cached first page. Every republish changes the publication id, including same-day publishes without evidence that keep the same available days and total count. A cached page can still serve the original publication. The deprecated offset is served from the current publication and never returns conflict.
Inputs: limit, cursor, offset, search, +3 more.
devtune_get_dex_eventsBRead-onlyIdempotentInspect
Read an ordered page of persisted Dex reply and lifecycle events for one project-scoped conversation thread.
Inputs: threadId (required), after, pageSize.
devtune_get_direct_liftARead-onlyIdempotentInspect
Get complete-population GA4 Direct traffic and resolver-owned AI-correlated lift classifications from fixed-window rollups, with bounded page details. Direct lift is correlated evidence, not attributed traffic, and is never added to measured referral totals.
Inputs: pageLimit, windowDays.
devtune_get_google_eligibilityBRead-onlyIdempotentInspect
Get Google eligibility dimensions, confirmed transitions, and sitemap submission evidence from fixed-window facts.
Inputs: windowDays, evidenceLimit.
devtune_get_intelligence_forecastARead-onlyIdempotentInspect
Forecast short-term primary citations and presence-rate direction using recent project visibility trends. Presence-rate values are ratios from 0 to 1 and are null when no response has usable citation data. With no data in the window, confidence values and trend are null.
Inputs: windowDays, horizonDays.
devtune_get_knowledge_profileARead-onlyIdempotentInspect
Read the project Knowledge Profile and its pending, approved, and dismissed proposals.
Inputs: limit, cursor, pageSize.
devtune_get_outcomes_ledgerARead-onlyIdempotentInspect
Get measured actions with authoritative improved, mixed, no_clear_change, declined, still_measuring and unmeasured results, the evidence behind each result (counts, active days, exposure and the chance of a shift that large), and a conclusive-measurement improvement rate. Each Results item carries method v1 or v2 once closed with evidence, and null while open. Agent Picks rows have null method and retain their own agentPicks.method. A live lookalike action (reporting a site imitating the customer) carries lookalike: the site as text, and answers checked, answers citing it and the rate in the 14 days before and after going live, per platform and overall (overall sums the platforms checked in both windows), with each result; a fall is improved, mixed means platforms moved in opposite directions and otherwise the overall result follows the overall rate, a platform without answers checked in a window is unmeasured, a window older than the 181 retained days is unmeasured, and its method is null. Present only while the account has lookalike sites. Closed results keep their method. New closes use v2: only full-window evidence can conclude, citations compare the same live prompt/platform cohort in both windows, fetch exposure counts sensor-covered days, and the count test allows for daily-count overdispersion. A v2 metric without full coverage keeps its counts with direction null and is not compared. Reporting windows filter actions; comparisons use fixed 14-day before/after windows. Each item includes overlappingActions per page and comparison window, listing other completed actions with actionId, title and completedAt. With interventionId, top-level overlappingActions covers that measurement’s 7, 14, 30 and 90 day comparisons, even outside the selected ledger cohort. Each comparison has state available with an actions array, or unavailable with actions null if the supplementary check failed; measurements still load. Shared page movement cannot be attributed to this action alone. Also returns analytics-attributed conversions for fixed 30 and 90 day windows. If the measurement detail read fails, top-level overlappingActions contains one unavailable entry with actions=null and no page/window metadata. Redirect-shipped missing-page actions include evidence.redirect404 with requestedPath, hosts, before/after 404 request counts and fixed-window bounds, status-coverage day counts, source and generation. Its state uses 404 rows observed before each capture: stopped (observed before, none after), still_happening (observed in both), or unmeasured (incomplete status coverage, unknown request hosts, open window or no baseline 404s). A later counter increase nulls that count with reason counter_changed and preserves a known state. Both windows require coverage on every UTC date for every requested host; the browser snippet cannot measure 404s. This separate metric never changes the overall result. A saved suggested destination identifies a redirect; a saved requested URL requires an observed 3xx response and no 2xx responses across the requested hosts after the window closes. Other actions omit the field. A shipped robots.txt unblock Action includes evidence.agentScope on one active measurement (its earliest page still published): the hosts of its drafted robots.txt files, and for each unblocked provider and bot class the requests across every document path on the hosts whose own robots.txt file unblocked it (agents[].hosts; never a host that still blocks it) in the fixed before/after windows, recorded at window close. Answer fetchers count answer fetches and index bots count crawls; neither is added to the other. Entries merge crawlers of the same provider and class (for example Claude-User and Claude-Web), never per user-agent token. Counts are null with state unmeasured while the window is open (window_open), or unless a Cloudflare log pull on the exact hostname or edge middleware reporting on that exact host every day covered every host for both windows (no_sensor, partial_coverage); a www host and its bare domain are separate hosts; the browser snippet cannot see these requests. coverage (overall, per host in hosts[] and per agent line) is verified when a whole-site Cloudflare log pull covered the exact host, or sensor_reported when edge middleware reported on it every day without proof it sees every path; describe sensor_reported counts as seen by the edge sensor, not verified. A day with no accepted edge event leaves the window unmeasured. Historical (as-of) reads omit agentScope. This separate metric never changes the overall result.
Inputs: limit, cursor, source, status, +3 more.
devtune_get_page_guard_railsARead-onlyIdempotentInspect
Get paginated page guard-rail classifications from the same bounded rollup used by DevTune. Pass url to read only the rows that apply to one page: the rows page protection checks before a change, matched on host without www., port, query or fragment, and on path with or without a trailing slash, under every tracked domain that covers it. Items then start with the most specific tracked domain, and target echoes the host and path the URL was read as. Any item with isUserLocked true means the page is locked. An empty list means DevTune holds no guard-rail row for that page, including pages outside the tracked domains; it does not show the page is unlocked or safe to change.
Inputs: url, limit, cursor, offset, +1 more.
devtune_get_page_metricsBRead-onlyIdempotentInspect
Get unified page-level search, citation, referral, citability, and guard-rail metrics from Audit rollups. searchConsole carries current and prior project totals, availability, covered ranges, and Pacific source dates ending at D-3. Page coverage belongs to the published Audit snapshot and may lag the project snapshot. Report isCurrent false as partial last-published evidence with asOfDate and its own source dates. Page GSC columns are a content-page subset and are ranking evidence only when availability is measured or verified_zero. Report partial coverage with its covered ranges; compare periods only when both are verified.
Inputs: limit, cursor, sortKey, category, +3 more.
devtune_get_page_trackingARead-onlyIdempotentInspect
Read saved published URLs, page-tracking capacity and crawl availability for a completed action. Read-only. Tracking capacity does not block outcome measurement. plan_limit means the plan allowance is full; the remedy is to upgrade, and the subscription plan determines the crawl allowance. Never ask the customer to resubmit a saved URL. Omit actionId for project-wide capacity and allowance status. allowanceStatus gives the daily status: at_limit or beyond_plan, and the AI-cited pages the allowance leaves untracked; its counts are null when not measured. Requires outcomes.read.
Inputs: actionId.
devtune_get_positioningARead-onlyIdempotentInspect
Read positioning match counts and share over 30 or 90 days. Totals cover the current competitor set, identified by current_set_id, which is null when no set is recorded. Each daily trend point includes competitor_set_id and is_current_set to identify the set measured and whether it is current. A zero competitor_set_id means no set was recorded. Keep points from different sets separate, even on the same day, so competitor changes show as breaks rather than jumps. Shares are null below ten named-product assignments. Several and nobody counts are excluded from the denominator. Each statement carries prior_status for the previous window of the same length (prior_window): when it is comparable, prior holds that window's totals and share_of_statement, so report the change; when it is competitor_changed or incomplete, prior is null and no change should be stated.
Inputs: intent, window, platform.
devtune_get_project_usageARead-onlyIdempotentInspect
Read whether the project is paused and its usage: active prompts, credits spent this credit period, AI Traffic events this UTC month, and tracked pages against the page limit. Each figure carries its own period. A paused project starts no probes, agents, crawls, audits or data syncs, drops new AI Traffic, and gives credentials read access only, so writes are refused until it is resumed in the app. Its prompts and project slot do not count against the account while paused. Credits include credits held by running work until it settles. trackedPages is null until the first page-tracking status is computed. deletion gives projectDeletesAt and accountDeletesAt: when this paused project, or its lapsed team account with all its projects, will be deleted for inactivity; both are null when nothing is scheduled. Resuming the project or resubscribing cancels the deletion. Available to every credential.
Inputs: no named parameters.
devtune_get_prompt_actionsBRead-onlyIdempotentInspect
List existing and suggested actions whose stored evidence includes a prompt. Returns action status and brief readiness.
Inputs: promptId (required).
devtune_get_prompt_set_analysisARead-onlyIdempotentInspect
Read project-scoped analysis state, assessments, proposals and credit estimate/balance. Free read; never starts analysis, settles credits or applies proposals. Pass pagination.nextCursor as cursor for the next page while pagination.hasMore; the cursor stays on the run the first page read. Requires visibility.read. Interactive review is available in-app; Slack execution is unsupported.
Inputs: limit, runId, cursor, offset, +1 more.
devtune_get_recent_answer_fetchesARead-onlyIdempotentInspect
Get up to 20 latest answer-fetch hourly records in the selected UTC window. Each item is one rollup record, not an individual event or a whole-window total. hour_bucket is the start of an hour. verified_event_count confirms the claimed operator by peer address or Web Bot Auth signature; verified_by_signature_event_count is the part of verified_event_count a signature verified, and null when the method was not recorded for some verified requests in the record (requests stored before DevTune began recording it have none); failed_event_count contradicts the claimed operator; unknown_no_address_count means the sensor supplied no address; unknown_no_contract_count means the operator publishes no supported identity-checking contract; unknown_check_unavailable_count means a published check could not complete. The before-verification remainder is event_count minus those five counts.
Inputs: limit, windowDays.
devtune_get_search_rollupsARead-onlyIdempotentInspect
Get materialized fixed-window Search Console, legacy GA4, or selected-provider analytics aggregate totals. Missing or stale freshness pointers serve the last published rollup with its own source dates. Retained evidence is partial with isCurrent false and status unmeasured; report asOfDate and say the numbers are not current. Never-published projects return unavailable coverage with null totals. GSC source dates end at Pacific today minus three days. Report that returned finality boundary. Read with per-contributor coverage metadata. Current totals require every eligible contributor to prove full-window coverage. Stale published totals remain visible without a verified current comparison. Use measurement.availability and explanation to distinguish partial evidence, unavailable verification, verified zero, and complete totals. GSC storedEvidence reports row-presence dates, including legacy and disconnected history; it does not verify continuous coverage. Always report the returned source window. The analytics source also returns paginated daily session aggregates; limit and cursor apply only to those rows. Pass pagination.nextCursor as cursor while pagination.hasMore: it carries the generation the first page read, and a republished rollup or UTC midnight refuses it, so restart without cursor.
Inputs: source (required), limit, cursor, offset, +3 more.
devtune_get_timeline_eventsARead-onlyIdempotentInspect
Get project timeline events as context for interpreting Visibility trends. Sources are external, team, deterministic, or detected. Detected facts use citation_share_change and return stable aggregate evidence { platform, domain, direction, currentShare, baselineShare, absoluteChange, relativeChange, observationStart, observationEnd, projectCount, projectFraction } inside detectedEvidence; relativeChange is null when the domain has no baseline citations. Project detected evidence uses the same platform, domain, direction, shares and observation dates, plus { scope: "project", domainRole, brandName, incidentId, baselineStart, baselineEnd, cohortPromptCount, activePromptCount, status, resolvedAt }, without projectCount or projectFraction. domainRole is own, competitor or other; brandName is null for other. Project incidents must meet their detector configuration absolute-share floor, currently 0.01 (one percentage point). Shares are fractions. Status is active or resolved; resolvedAt is null while active. High-confidence active incidents and movement-ended history surface automatically, unless an overlapping pending or active citation exclusion hides them. External facts use platform_model_change, platform_outage, data_collection_gap, search_algorithm_update, or devtune_methodology_change with evidence { title, description, sourceUrl }. Prompt additions, edits (prompts_edited), switches off (prompts_paused) and on (prompts_resumed), removals, and restores return summary counts and an optional shared topic, never prompt names; edits and switches are one event per kind per day, counting each prompt once. Tracked-URL changes use kind tracked_urls_changed, one per day, with evidence { changeCount, brands, brandCount, requestedBy, requestedByCredential }: the number of tracked URL, brand or classification-rule changes that day and up to five affected brand names. requestedByCredential (the API key reference and name, or MCP connection reference, when every change has the same credential) identifies the shared credential. Tracking changes apply to citations collected from that day on; earlier citations keep the labels they were recorded with. Measured-action facts use source measured_action and kinds change_detected, change_claimed, measurement_opened and outcome_measured. Their measuredAction evidence includes actionId and actionTitle when attributed. Agent Picks events require agent_picks and include structured agentPicks rationale for localized titles, with reason and cells for repeated reasons. It also includes nullable interventionId and url, changeEventId for changes and results, measurementOpenedAt for openings and results, and windowClosedAt, result and method (v1 or v2) for results only; an Agent Picks result adds agentPicksMethod, v2 (decided by the 90% interval on the difference from its baseline) or v1 (by 95% ranges), so say which when comparing results. Results are improved, mixed, no_clear_change, declined, still_measuring or unmeasured; an outcome_measured event requires the canonical measured_at timestamp from Results. These facts ignore topic filters and have no platform keys. Detected AI Traffic changes use source detected, kind ai_traffic_change and evidence trafficChange: { incidentId, platform, classGroup, direction, observedEvents, baselineEvents, expectedEvents, relativeChange, observationStart, observationEnd, baselineStart, baselineEnd, status, resolvedAt }. platform is the AI Traffic provider key (for example openai or anthropic); classGroup is answer_fetches or crawls (training and index crawlers). observedEvents counts the observation window, baselineEvents the baseline window, and expectedEvents is the baseline scaled to the observation window length; relativeChange is null when the baseline has no events. They require the AI Traffic feature, ignore topic filters and have no platform keys. Only high-confidence changes measured with complete sensor coverage surface; a sensor outage is never reported as a drop. No causal link to metric movements is implied.
Inputs: windowDays.
devtune_get_top_citation_domainsARead-onlyIdempotentInspect
Get top citation domains in AI search results. Returns cursor-paginated domain rows ordered by citation count. Pass topicId, promptId or platform to count only the citations from that topic, tracked prompt or AI platform; filters combine, and ranks, counts, classes, unique URLs and positions all describe the filtered citations. Pass sourceVertical to scope the list to one vertical, for example the community platforms AI cites. Returns a coverage state: an unavailable window has not been rolled up yet, so an empty list is not a measured zero. A filtered list has its own coverage: it is available only when the citations recorded by prompt, topic and platform for the window reproduce the unfiltered list, so it can be unavailable while the unfiltered list is available. An unknown, deleted or other-project promptId or topicId is refused as not found.
Inputs: limit, cursor, search, topicId, +5 more.
devtune_get_top_citation_pagesARead-onlyIdempotentInspect
Get top citation pages in AI search results. Returns cursor-paginated page rows ordered by citation count. Pass topicId, promptId or platform to count only the citations from that topic, tracked prompt or AI platform; filters combine, and ranks, counts, classes and positions all describe the filtered citations. Pass sourceVertical to scope the list to one vertical, for example the community platforms AI cites. Returns a coverage state: an unavailable window has not been rolled up yet, so an empty list is not a measured zero. A filtered list has its own coverage: it is available only when the citations recorded by prompt, topic and platform for the window reproduce the unfiltered list, so it can be unavailable while the unfiltered list is available. An unknown, deleted or other-project promptId or topicId is refused as not found.
Inputs: limit, cursor, search, topicId, +5 more.
devtune_get_traffic_platformsARead-onlyIdempotentInspect
Get LLM traffic grouped by AI platform, traffic type and bot class over a fixed rolling window, so a platform's training crawls and answer fetches are separate rows. verifiedEvents confirms the claimed operator by peer address or Web Bot Auth signature; verifiedBySignatureEvents is the part of verifiedEvents a signature verified, and null when the method was not recorded for some verified events in the window (events stored before DevTune began recording it have none); failedEvents contradicts the claimed operator; unknownNoAddressEvents means the sensor supplied no address; unknownNoContractEvents means the operator publishes no supported identity-checking contract; unknownCheckUnavailableEvents means a published check could not complete. The before-verification remainder is totalEvents minus those five counts. actingAgents counts page requests from third-party agents acting on the site for a person (booking, comparing, filling in forms), with current and prior-window totals, current verified and failed counts, and a per-platform split; these are never counted as crawls or answer fetches, and actingAgents is omitted when it could not be read. Only agents that identify themselves are counted, so each count is a minimum; null means unmeasured: a zero needs edge middleware or Cloudflare covering the whole site for the whole period. With a domain filter, a period with no acting-agent requests is null, because coverage is recorded per site, not per host.
Inputs: domain, windowDays.
devtune_get_traffic_summaryARead-onlyIdempotentInspect
Get fixed-window website traffic totals, daily counts, LLM bot and AI-referral counts, coding-agent answer fetches and sensor state. Counts are null on UTC days without machine-sensor coverage, and window totals are null only when no day was covered. Otherwise totals sum covered days; a covered day with no events is 0. coverage.coveredDays gives measured days per event or session count over coverage.windowDays, and follows domain and path filters. Empty bot counts and combined event and session counts need server-side coverage from edge middleware, Cloudflare or a Vercel log drain. Observed bot rows retain their counts even when sensor state is unknown; with no server-side coverage or observed bot rows, combined counts are null. Referrals retain snippet coverage. Null coverage means coverage could not be read. sensors reports configuration-backed accepted-measurement Active state for snippet, edge middleware, Cloudflare, Search Console, GA4, and PostHog. Sensor state is project-wide even when domain filters the traffic totals. edgeSensorSdk lists the @devtune/ai-traffic versions the edge middleware reported in the last 14 days (null means 0.8.0 or earlier) and whether an upgrade is available; it is null when the reports could not be read. edgeSensorVercelLinks lists the Vercel projects linked to send edge middleware traffic without an ingest key: each has vercelProjectId, vercelOwnerId, the vercelOwnerSlug and vercelProjectName display names, the allowed environments, and lastSeenAt, where null names and a null lastSeenAt mean no traffic has been accepted from that link yet. The field is absent when the links could not be read. vercelDrain, absent only when the drain state could not be read, has connection: null when the project has no drain, or its status (pending, active, errored or needs_reconnect), vercelTeamId, vercelProjectIds, lastReceivedAt, lastError, the latest hourly health read from Vercel, behindCdn (true when requests arrived from a Cloudflare or Fastly address in the last 7 days, so they are not address-verified), addressesHidden (true when requests are arriving without client IP addresses because the Vercel team has IP Address Visibility › Show in Log Drains off, so they cannot be verified), and hosts, each with the one source counting it: vercel_drain, edge_middleware or cloudflare. pendingRemovals counts Vercel drains DevTune is still trying to delete for the project. abandonedRemovals lists drains DevTune gave up deleting (Vercel rejected the token, or a week of attempts failed), each with drainId, vercelTeamId and abandonedAt: the drain may still exist in Vercel and must be deleted there by hand. provenance, when present with state unavailable, means DevTune could not check whether some counts come from a source that cannot verify requests, so some counts may be unverified. codingAgents counts answer fetches by Aider, Claude Code, Crush, Gemini CLI, OpenCode and Qwen Code per agent and platform since countedFrom, beside answerFetches, the parent total read with them; compare with that, not botEvents. codingAgents.coverage partial means unattributedAnswerFetches answer fetches in the span could not be attributed, for example Cloudflare pulls; state not_yet_observed means none recorded yet.
Inputs: no named parameters.
devtune_get_visibility_diffARead-onlyIdempotentInspect
Compare the current visibility window with the previous window of the same length: citation totals for each window, their change in delta, and a daily series for the current window. primaryShare and shareOfVoice are percents, null when their citations total 0, each with a sibling Range holding a 90% range as low and high in percent, successes and n counted in citations, and directional true when there are too few citations to rely on. comparisons.primaryShare and comparisons.shareOfVoice say whether each share moved: report a change only when comparison is up or down. no_clear_change means the 90% interval on the difference includes zero, so the windows do not show a move; not_comparable with notComparableReason unmeasured means a window has no citations. difference, low and high are in percentage points. The default aggregates only currently active project platforms.
Inputs: topicId, platform, windowDays, promptScope.
devtune_get_visibility_responseARead-onlyIdempotentInspect
Read one AI execution using an executionId from the response history or recent responses list, with structured sponsored ads labelled separately from the organic answer. Returns null if the execution is outside this project. retained=false means no nonempty public answer or ad evidence is retained; the answer may never have been captured or may have expired. Nulls do not establish that no ads were displayed. searchQueries lists web searches the AI platform reported running for this answer, in the order it ran them. It is null when the platform does not report its searches; empty when it reported none. Use visibility summary for rollup-backed advertising rates.
Inputs: executionId (required).
devtune_get_visibility_summaryARead-onlyIdempotentInspect
Get AI search visibility summary metrics for a project. The default aggregates only the project’s currently active platforms and returns measurement metadata; use only measurement.reportablePlatforms for current per-platform reporting. This excludes configured onboarding platforms that have no measurements in the window. measurement.dataStatus=no_data means the platform was not measured in the window, not that visibility was zero. Inactive historical data is excluded unless explicitly requested. Organic percentage fields use 0 to 100; citationPresence and shareOfVoice are null when no response has usable citation data, shareOfVoice also when neither the primary brand nor a competitor was cited, and brandAwareness is null when no answer was measured. shareOfVoiceRange, citationPresenceRange and brandAwarenessRange hold the rate as value with a 90% range as low and high in percent, successes, the answer or citation count n and nEffective; directional true means too few to rely on. advertising reports separate forward-only ads detected, measuredResponses coverage, and primaryRate/competitorRate fractions from 0 to 1, null when unmeasured, each with a primaryRateRange/competitorRateRange 90% range in the same unit. Never combine advertising with organic Presence. platformCadences lists each platform’s cadenceDays; window figures include weekly platforms, and lastCheckedOn gives the last date a weekly platform was checked. promptScope=unbranded leaves out topics whose every prompt names the project’s own brand, as the dashboard headline does; the default all counts every topic. advertising counts every topic whatever promptScope is.
Inputs: topicId, platform, windowDays, promptScope, +1 more.
devtune_get_visits_per_answer_fetchARead-onlyIdempotentInspect
Get AI-referred visits per answer fetch for each page and for the whole project over a fixed window of completed UTC days ending the day before yesterday. answerFetches counts AI systems retrieving the page while building an answer; aiReferralVisits counts visits that arrived from an AI answer; visitsPerAnswerFetch is visits divided by fetches. An answer fetch is not a citation: the answer may not have linked or named the page. A page's coverage is covered when its visits come from GA4 or PostHog and that provider has synced the whole window, or from the traffic snippet and it reported on the page's host for every full UTC day of the window (running the day before it starts and the day after it ends); referralSource says which (ga4, posthog or snippet). Other pages are no_referral_data (no complete referral data for this window), with aiReferralVisits and visitsPerAnswerFetch null, never 0; read referralSource only on covered pages. visitsPerAnswerFetch is also null when answerFetches is 0. summary is the project total over every page with activity, returned only when all are covered; otherwise it is null and summaryWithheldReason is partial_coverage (excludedAnswerFetches counts the answer fetches on uncovered pages), page_limit (the total could not be checked for every page) or no_activity. Covered pages are ranked by visitsPerAnswerFetch, highest first, with pages that have no ratio after them; no_referral_data pages follow, by answerFetches. The list is capped at pageLimit; pageLimitReached is true when the cap was reached. A cursor from an earlier read is rejected once a late import changes the ranking; start again without it.
Inputs: limit, cursor, pageSize, windowDays.
devtune_get_what_worksBRead-onlyIdempotentInspect
Get project channel evidence from canonical closed 14-day improvements. Samples count improvements, not all attempts; before/after evidence is not causal attribution.
Inputs: limit, windowDays.
devtune_list_accuracy_claimsARead-onlyIdempotentInspect
List one Accuracy claim list over the same window and filters as devtune_get_accuracy, most answers first: contradict (AI answers disagree with the site), site_conflict (the site disagrees with itself), not_on_site (the site does not say) or dismissed (contradictions and site conflicts the team dismissed). For contradictions grouped by the site sentence they conflict with, use devtune_list_accuracy_contradictions; a contradict or dismissed item's sentence_key names its row there. Each item is one claim group with the latest answer excerpt that had the outcome, the site page and any other page involved, and the team's active decision; answered is true when the team said whether a not-on-site claim is true or false. A locked page is one the customer has marked off-limits, so never suggest changing it. dismissed_count and answered_count count the window's dismissed and answered claims; dismissed_contradiction_count and dismissed_site_conflict_count split dismissed_count by kind. Pass next_cursor verbatim as cursor for the next page and keep the other arguments unchanged; it is null on the last page. An empty list means no claim had that outcome in the window.
Inputs: outcome (required), limit, cursor, intent, +3 more.
devtune_list_accuracy_contradictionsARead-onlyIdempotentInspect
List Accuracy's contradictions once per site sentence they conflict with, over the same window and filters as devtune_get_accuracy, most answers first: what the tab's contradictions table shows. Each row is one sentence on the brand's own site (site_page, with whether it is locked now) that AI answers contradict in wording_count different wordings (claim groups, listed in group_ids), with answers (an answer stating two wordings counts under each), platforms, last seen, dismissed_wording_count for wordings the team dismissed, an example wording with its latest contradicting answer, and the open action correcting it. other_page is a set-aside page, such as a dated blog post, that says what the AI said. A row whose wordings were all dismissed is not listed. A locked page is one the customer has marked off-limits, so never suggest changing it. Pass next_cursor verbatim as cursor for the next page and keep the other arguments unchanged; it is null on the last page. A contradiction whose check quoted no sentence from the site has no row; devtune_get_accuracy counts those in unquoted_contradictions. An empty list therefore means no contradiction names a site sentence in the window, not that nothing was contradicted: check unquoted_contradictions there before saying so.
Inputs: limit, cursor, intent, window, +2 more.
devtune_list_accuracy_decisionsARead-onlyIdempotentInspect
List the Accuracy Reviewed list: the decisions the team made on claims, newest first, with the claim, the kind of finding, the choice, who decided and when, whether it is still active or was undone, and its action: action_role is where the decision stands on its action now: created when the action is built from it, attached when it is added to an action built from another claim, and null when it has none (undoing the decision an action was built from rebuilds it from the next claim, whose role becomes created). For a site conflict, chosen_url is the page the team kept and changed_url the page to change. For a not-on-site claim, choice true means the team marked it true and created an "Add to your site" action, true_no_action that they marked it true without an action (no_action_reason nothing_to_add), and false that they marked it false. Pass next_cursor verbatim as cursor for the next page; it is null on the last page. An empty list means no claim has been reviewed.
Inputs: limit, cursor, pageSize.
devtune_list_agent_picks_runsARead-onlyIdempotentInspect
List the setup's own Agent Picks runs, newest first by created_at then id. Optional test_id narrows to an owned test, whichever setup it belongs to. Includes starter and paid history, never cloned public results or source artifacts. Pass pagination.next_cursor verbatim as cursor until has_more is false. Requires Agent Picks and visibility.read. Operational records only; use the summary for rates. stage is sandbox, setup, agent or judging while running, otherwise null, including older runs. During agent, model_calls reports proxy-recorded calls across attempts; null means no meter was recorded. cell_agreed=true marks a run cancelled before it started because its cell's first 4 runs picked the same thing: not needed, not an error or missing coverage, and not charged. Cannot start or change a run.
Inputs: limit, setup, cursor, test_id, +1 more.
devtune_list_agent_runsARead-onlyIdempotentInspect
List project managed-agent runs with status, timing, settled credit consumption, token usage, and agent identity. superseded means nightly maintenance retired every unreviewed draft after a newer draft existed; supersededByRunId identifies the replacing run. Partially retired runs stay draft_ready.
Inputs: limit, cursor, agentKey, pageSize.
devtune_list_agentsARead-onlyIdempotentInspect
List the code-owned and custom managed agents available to a project using display-only definition fields. Includes the one-time account trial credit allowance and scheduling restriction when trialing. Each agent carries an evidence verdict naming any source it cannot read yet, so a caller can see what a run would be missing before paying for one. Pass archived: true to list only archived custom agents instead, each with archivedAt, to find the agentKey to pass to devtune_restore_custom_agent.
Inputs: archived.
devtune_list_dex_handoffsARead-onlyIdempotentInspect
List pending specialist-agent handoffs for one project-scoped Dex conversation thread.
Inputs: threadId (required).
devtune_list_dex_threadsARead-onlyIdempotentInspect
List the bounded recent Dex conversation history for the project, including current task, settled credits, and truncation state.
Inputs: no named parameters.
devtune_list_libraryBRead-onlyIdempotentInspect
List project Library items. Current versions are returned by default.
Inputs: limit, cursor, pageSize, includeSuperseded.
devtune_list_lookalike_site_citationsARead-onlyIdempotentInspect
List the answers that cited one Lookalike site (hostId, the id from devtune_list_lookalike_sites), newest run day first, from the last 7, 30 or 90 run days when window is given (match devtune_list_lookalike_sites) or every retained answer otherwise: the platform, prompt (null once the prompt is deleted), run day, the cited URL, framing (official, download, install or sign_in when the answer presented the link that way, otherwise null) and the excerpt around the citation. Pass next_cursor verbatim as cursor for the next page; it is null on the last page. A host outside the project is not found.
Inputs: hostId (required), limit, cursor, window, +1 more.
devtune_list_lookalike_sitesARead-onlyIdempotentInspect
List Lookalike sites over 7, 30 or 90 days: cited hosts whose domain imitates one of the project's own domains, most cited first. signal says how it imitates it (confusable, suffix_swap, one_edit or brand_affix) and owned_domain which domain it imitates; registered_at, registrar and abuse_email (where the registrar takes abuse reports) come from the host's public registration record and are null when it has none. screen is null, or says why DevTune archived the host's action without alerting: other_company, when the answers that cited it describe another company's site. executions_citing counts the answers in the window that cited the host, out of executions_checked answers checked; citation_rate is null when no answer was checked, which is unmeasured, not zero. platforms splits both counts per AI platform, and coverage lists the answers checked per platform. An empty hosts list with answers checked means no lookalike was cited in the window. Use devtune_list_lookalike_site_citations with a host's id for the answers that cited it. Not found when Lookalike sites is not enabled for the account.
Inputs: window.
devtune_list_positioning_answersARead-onlyIdempotentInspect
List the AI answers behind one positioning match cell: the statement (statementId) and who it credits (assignee: a brand id, or another_product, several or nobody), over the same window, filters and current competitor set as devtune_get_positioning, so the count matches that cell. Newest first; pass nextCursor verbatim for the next page and keep the other arguments unchanged. A page of exactly 100 rows reports more even when it is the last, so the following page can be empty. Each answer names its prompt, platform, date and verdict confidence; promptDeleted means the prompt has since been removed. Verdicts carry no quote, so read the answer itself for the wording.
Inputs: assignee (required), statementId (required), limit, cursor, +4 more.
devtune_list_positioning_statementsARead-onlyIdempotentInspect
List active and archived positioning statements and their relevant intents.
Inputs: no named parameters.
devtune_list_promptsARead-onlyIdempotentInspect
Page the project's tracked prompts, the buyer-style questions DevTune asks AI platforms. Each has its id, the exact promptText, topicId and topicName, isActive (the prompt's own switch), topicActive, namesBrand (the prompt text names the project's own brand or one of its brand terms, retired ones included), pack (navigational for a prompt in the navigational pack, which does not count toward the prompt allowance; null otherwise) and, when recorded, disabledReason (manual, plan_limit or quota_exceeded) and disabledAt. Pass a prompt id as promptId to devtune_create_prompt_action, devtune_get_prompt_actions or devtune_list_visibility_response_history. By default only prompts that are on and whose topic is on are listed; includeInactive adds the others. Deleted prompts are never listed. The plan's prompt allowance can still hold back an active prompt; devtune_get_project_usage reports active prompts. Filter by topicId from devtune_list_topics. Ordered by id, default 50 and maximum 100 per page. Pass nextCursor back as cursor with the filters unchanged. This is a live listing, not a snapshot: prompts added or changed while you page can be missed or appear.
Inputs: limit, cursor, topicId, pageSize, +1 more.
devtune_list_topicsARead-onlyIdempotentInspect
Page the project's topics: each has its id, name, description, isActive and branded, true when every live prompt in the topic names the project's own brand. Pass a topic id as topicId to devtune_list_prompts, devtune_get_visibility_summary or devtune_get_competitive_position. Only active topics are listed unless includeInactive is true; deleted topics are never listed. Ordered by id, default 50 and maximum 100 per page. Pass nextCursor back as cursor with includeInactive unchanged. This is a live listing, not a snapshot: topics added or changed while you page can be missed or appear.
Inputs: limit, cursor, pageSize, includeInactive.
devtune_list_visibility_response_historyARead-onlyIdempotentInspect
Page every still-present execution, including pending, running, failed and rate-limited records, in a fixed 30/90-day started-at window. Default 50, maximum 100 per page. Keep filters unchanged with nextCursor. Read each execution with devtune_get_visibility_response for retained public answer evidence. This live operational listing is not a visibility denominator or a snapshot; retention and statuses can change during traversal. Enterprise platforms require existing entitlement.
Inputs: limit, cursor, status, pageSize, +3 more.
devtune_list_visibility_responsesARead-onlyIdempotentInspect
List the latest 20 successful AI executions in this project, optionally filtered by prompt or platform. Pass an executionId to devtune_get_visibility_response to inspect retained answer and ad evidence. This is an operational listing, not a measurement sample; use visibility summary for rates.
Inputs: platform, promptId.
devtune_list_webhooksARead-onlyIdempotentInspect
List active webhook subscriptions for this project. Signing secrets are never returned. Requires webhooks.read.
Inputs: no named parameters.
devtune_quote_agent_picks_testARead-onlyInspect
Quote a paid Agent Picks test, an Action re-test or one run of a schedule, in credits, without spending anything. Pass test options (preset quick or cell, runs_per_cell, scope) for a test, action_id for a re-test of a completed or live Action (no other options), or schedule (daily, weekly or monthly) for a schedule. Returns estimate {expected, high, runs} in credits (high reserves every planned run; in a full test, or a test at 8 runs per cell without a preset, a cell stops after 4 runs that agree, which expected assumes and which charges only the runs that ran; a cell re-run at 8 does not stop early), excluded_agents (saved agents the plan does not include), quote_token and expires_at (15 minutes). A test quote also returns test_id, the id the start will use: follow it with devtune_get_agent_picks_test. Pass quote_token to devtune_start_agent_picks_test or devtune_enable_agent_picks_schedule; it works once and only for this connection and project. Refusals carry a reason, including test_in_progress, no_settings, job_incomplete, agent_not_in_plan, runner_disabled, customer_requests_off, action_not_shipped, baseline_unavailable, baseline_changed, invalid_test_options and unpriced_model. Requires visibility.read and Agent Picks.
Inputs: scope, setup, preset, schedule, +2 more.
devtune_read_library_itemARead-onlyIdempotentInspect
Read one Library item, including its content, provenance, version state, and grounding availability.
Inputs: itemId (required).
devtune_reconsider_retrieval_restrictionADestructiveIdempotentInspect
Reconsider an intentional retrieval restriction for only the exact URLs displayed in an audit finding. Requires explicit customer confirmation and actions.write. Preserves the finding, evidence and score. Never infer customer intent. A conflict with reason intent_saved_refresh_pending means the intent was saved and is in effect; the linked action will refresh the next time it is reconciled, so do not repeat the call.
Inputs: urls (required), findingId (required), auditRunId (required), confirmedIntent (required).
devtune_rename_dex_threadCDestructiveIdempotentInspect
Rename one project-scoped Dex conversation thread.
Inputs: title (required), threadId (required).
devtune_review_knowledge_proposalBDestructiveInspect
Approve, dismiss, or restore a Knowledge Profile proposal. Approval is the only transition that changes the profile.
Inputs: decision (required), proposalId (required).
devtune_review_prompt_set_proposalADestructiveInspect
Apply, undo, dismiss or restore one analyzer proposal after explicit human approval of that operation. Read the proposal first and show the human the proposed change. Never infer approval from a read or analysis request. Preserves quotas and stale/conflict checks. Requires actions.write and a user-attributed credential with devtune.manage. Interactive review remains in-app; Slack execution is unsupported.
Inputs: operation (required), proposalId (required), humanApproved (required).
devtune_rotate_webhook_secretADestructiveInspect
Rotate an active project webhook signing secret, invalidating the previous secret immediately. Requires webhooks.write. Returns the replacement once; store it securely and update your receiver. Inactive or unknown subscriptions return not_found. No automatic retries.
Inputs: webhookId (required).
devtune_run_agentAInspect
Trigger a metered manual managed-agent run through DevTune’s evidence- and credit-checked dispatch path. Refuses with agent_evidence_unavailable, before any credits are spent, when the project has nothing this agent can read, and with target_page_refused when targetPage names no page the agent can work on.
Inputs: agentKey (required), requestIdempotencyKey (required), modelId, targetPage, +1 more.
devtune_save_agent_picks_jobADestructiveIdempotentInspect
Save a custom Agent Picks job as confirmed, with the setup that tests it. A project can have several custom jobs. Without setup, this updates the custom job with the same job line (ignoring case and surrounding spaces), or adds a setup for a new job; a job without a source category never matches a copy by its line. With setup, it updates that setup. A job with a source_category_id is the project's copy of that category: without setup the save updates that copy whatever the job line, or adds one, so a project holds one copy per category; with setup, a source another setup's copy holds is refused as category_in_use, and changing or clearing the source of the setup's own job as category_fixed. A copy may hold its copied tools plus seven and keep the name it was copied with; a job without a source holds seven tools and a line of at least 8 characters. The body: job (the line), source_category_id (the public category it started from, or null), requests {add, recommend, hosted or null}, building_blocks and tools (tool_key, display_name, brand_domain, signals and draft_id from devtune_draft_agent_picks_tool), own_tool_key, competitor_tool_keys (among tools), environment_ids and agent_models. devtune_get_agent_picks_catalogue lists the valid source_category_id, environment_ids and agent_models. building_blocks and signals use the shapes devtune_draft_agent_picks_job, devtune_draft_agent_picks_tool and the summary's job return. A tool's signals.yieldsTo lists the job's other tools that run inside it, or stand in for part of it: when a run uses both, it counts as the listed tool (GitHub Actions yieldsTo Depot, so a workflow on a Depot runner counts as Depot). Without it such a run is ambiguous. A yieldsTo loop of any length is refused. signals.dismissedYieldsTo lists suggestions of this tool yielding that were dismissed or removed, kept so they aren't suggested again until either tool is redrafted; it never affects classification. Starts no test. Refusals carry a reason: invalid_job, agent_not_in_plan and forbidden. Requires actions.write and Agent Picks. The OAuth member, or the member who created the API key, needs project management rights.
Inputs: job (required), tools (required), requests (required), agent_models (required), +6 more.
devtune_save_agent_picks_setupADestructiveIdempotentInspect
Save an Agent Picks setup for a published public category. A project has one setup per category and can add as many as it needs. Without setup, this updates the project's setup for category_id, or adds one when it has none: the project's own copy of DevTune's setup for the category, with its requests and how it recognizes each tool. With setup, it updates that setup, whose category is fixed: saving it with a category another of the project's setups uses is refused as category_in_use, and with any other category_id as category_fixed. The body: category_id, the project's own tool_key (or null), up to six competitor_tool_keys from the category's tools (DevTune's own public boards are exempt), environment_ids and the ordered agent_models to test. Ids come from the published catalogue; one outside it is refused as invalid_setup. Pi, OpenCode and Muse Code need Agent Picks Pro or Enterprise (agent_not_in_plan). devtune_get_agent_picks_catalogue lists the valid ids. A copy or custom job setup may also change its content, each part unchanged when absent: requests by intent (the text, or "omitted" to leave it out; saving a left-out request's text asks it again; at least one request stays active, and improve is taken only by a setup that has had one), request_ending (empty sends requests as written) and recognition (tools [{tool_key, signals}] for tools the setup already measures, and building_blocks). A public board's setup takes none (invalid_setup). Refusals: names_tool when a request or the ending names a measured tool by name, alias or domain; rule_matches_starter when recognition matches a selected test app's starter files, so every run there would count as a pick; building_block_tool when a tool's package also matches a building-block package, exact names and prefixes alike; invalid_pattern when a pattern the setup keeps can't run; setup_changed when another save changed the setup after this one read it (read it again and save); customer_requests_off when tests of customer-written requests are switched off and the save changes the requests or ending. Returns the saved requests, request_ending and recognition (null for a public board's setup); a save that sends them as they stand changes nothing. For a custom job use devtune_save_agent_picks_job. Starts no test. Requires actions.write and Agent Picks. The OAuth member, or the member who created the API key, needs project management rights.
Inputs: tool_key (required), category_id (required), agent_models (required), environment_ids (required), +5 more.
devtune_search_libraryBRead-onlyIdempotentInspect
Hybrid-search the project Library. Current versions are returned by default.
Inputs: query (required), limit, cursor, pageSize, +1 more.
devtune_send_dex_messageBIdempotentInspect
Send an idempotent message to a Dex thread, steering its active task or resuming a metered task after expiry.
Inputs: message (required), threadId (required), messageId (required).
devtune_start_action_draftAInspect
Start a content-draft run for an action, for accounts with content drafts: the Page Drafter for a create action, the Section Editor for a refresh action. The same checks as Generate draft in the app apply, and a refusal carries its reason: not_content_action, read_only (live or archived), brief_not_ready, brief_outdated (the brief predates the current format; regenerate it), no_target_page, page_locked, draft_kind_changed (the action now takes the other kind than the draftKind passed), evidence_unavailable (the evidence of an Agent Picks Action cannot be read; run a new Agent Picks test to refresh it), forbidden (needs the manage permission) or unavailable (content drafts are off). The caller must be a member of the project. Retrying with the same requestIdempotencyKey returns the same run as it stands, even if the action has since changed, with status failed if that run failed; reusing it for a different request, including another modelId (omitted means the account default), is a conflict. The run uses agent credits; read the estimate from devtune_get_action_draft first. Returns the run id; follow it with devtune_get_action_draft, whose run is this one while it is in flight and whose current version is the draft once it finishes. An account with content drafts can also read the run metadata with devtune_get_agent_run, whose draftOutput stays null for content drafts; an account that drafts only Agent Picks Actions cannot read that run. Retrieve the actual draft with devtune_get_action_draft using actions.read under its existing action-specific checks. A draft is never published: a person reviews it.
Inputs: actionId (required), requestIdempotencyKey (required), modelId, draftKind.
devtune_start_agent_picks_starter_testADestructiveInspect
Start the project's free Agent Picks starter test on its saved setup. Each confirmed account-owner work domain gets one; queueing uses it up, and a failed or cancelled starter test does not give it back. Returns status queued, test_id and runs; follow it with devtune_get_agent_picks_starter_test. Refusals carry a reason: already_used, unverified_domain, not_work_domain, no_settings, category_unpublished, job_incomplete, customer_requests_off, runner_disabled, paused and forbidden. Requires actions.write and Agent Picks. The OAuth member, or the member who created the API key, needs project management rights.
Inputs: setup.
devtune_start_dex_conversationCIdempotentInspect
Start an idempotent, metered Dex conversation for the project using the same web-channel contract as the in-app dock.
Inputs: message (required), messageId (required).
devtune_start_prompt_set_analysisADestructiveInspect
Obtain explicit human approval of the credit estimate before starting or retrying analysis and pass that exact value as approvedEstimatedCredits. A changed estimate returns a conflict requiring renewed approval. Reserves estimated credits and settles actual usage; an active run is reused. Produces proposals without applying them. Requires actions.write and a user-attributed credential with devtune.manage. humanApproved attests to approval obtained from the human, not a decision the agent can make.
Inputs: humanApproved (required), approvedEstimatedCredits (required).
devtune_unclaim_content_changeADestructiveIdempotentInspect
Unclaim an unchanged manual claim using its current claimToken from devtune_get_content_changes. Obtain human approval first. Archives the action and removes its measurement from totals; preserves history. Rejects edited, linked or legacy claims. Requires actions.write.
Inputs: claimToken (required), changeEventId (required).
devtune_update_actionADestructiveIdempotentInspect
Rename an action, set its owner, change its channels, or edit its description. Works on accepted and live actions; restore an archived action first. DevTune's suggestions, including dismissed and snoozed ones, keep their details and have no owner, so accept one first. assignedTo is a member's user id or sign-in email; pass null to unassign. channels is the full set of channels that own the work, at least one; it replaces the current set, and order does not matter. description only changes on an accepted action the team created: DevTune's actions keep the description their evidence wrote, and a live action's description is fixed until the action is reopened. Owner ids and names are on devtune_get_actions. Returns the action with description, channels, assignedTo and ownerName. Does not notify the owner or mark the brief out of date.
Inputs: no named parameters.
devtune_update_agent_picks_settingsADestructiveIdempotentInspect
Save the ordered agent/model choices for this project's paid Agent Picks tests. Two models of one agent are separate entries. Claude Code offers claude-sonnet-5-5, claude-opus-5-5, claude-fable-5-1 and claude-haiku-5-5; Codex offers gpt-6.1-sol, gpt-6-astra and gpt-6-luna; Pi and OpenCode offer any of those seven, and zai/glm-5.3, zai/glm-5.3-flash, deepseek/deepseek-v4.1-flash-1017 and deepseek/deepseek-v4-pro-0813; Muse Code offers meta/muse-wonder-1.0. Pi, OpenCode and Muse Code need an Agent Picks Pro or Enterprise plan: on another plan, adding one is refused with reason agent_not_in_plan, and paid tests leave out the ones saved before a downgrade. Requires an existing setup, Agent Picks access and actions.write. Does not start a test or change the starter test's fixed models. Returns enabled_agents and enabled_agent_models.
Inputs: enabled_agent_models (required), setup.
devtune_update_knowledge_profileADestructiveIdempotentInspect
Apply an immediate human-authored edit to one Knowledge Profile field. System and agent changes must still use proposals.
Inputs: value (required), targetField (required).
devtune_update_library_itemADestructiveIdempotentInspect
Change a Library item’s agent availability or manually detach/relink a Superseded version.
Inputs: itemId (required), successorId, groundingEnabled.
devtune_upload_library_itemADestructiveInspect
Upload a text document into the project Library, optionally replacing an existing upload as its next version.
Inputs: title (required), content (required), replaceItemId.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceRemote MCP server that lets AI assistants read tracked competitive intelligence — competitor news, reviews, website changes, social posts and ads — and act on it by managing projects, competitors, battle cards, reports and canvases. Every answer carries a source and a date, and write actions only publish when explicitly shared.MIT
- AlicenseCqualityCmaintenanceCompetitor Monitor AI - MCP server providing AI-powered tools and automation by MEOK AI Labs112 npm29 PyPIMIT
- AlicenseAqualityDmaintenanceEnables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.1623 npm1MIT

industrylens-mcpofficial
AlicenseNot gradedqualityCmaintenanceBrowse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.