Skip to main content

MCP

MCP tool reference

The twelve primary pre.dev tools, including memory, exact input names, result formats, and deprecated aliases.

The hosted pre.dev MCP server is https://api.pre.dev/mcp, over Streamable HTTP. It runs pre.dev’s specification, browser, and memory tools. Searching this documentation is a separate MCP server, https://docs.pre.dev/mcp, which needs no key.

Connect once to use specification generation, project plans, browser automation and memory: run npx -y @predotdev/mcp setup to add the local server to every coding agent on your Mac, or connect the hosted server. Setup instructions cover both, with authentication and client configuration.

Call tools/list after initialization for the live input schemas. GET /mcp/info is a human-readable service inventory; it is not the protocol’s tool-discovery method.

Tool inventory

ToolPurposeResult
fast_specGenerate a concise specificationText with artifact links or a get_spec handoff
deep_specGenerate a detailed specificationText with artifact links or a get_spec handoff
get_specRetrieve a specification and its statusText and, on success, structuredContent
list_specsPaginated specification historyText and, for a nonempty page, structuredContent
get_planA project’s verified planMarkdown text and structuredContent
browser_agentRun browser tasksText summary or an async run ID
browser_agent_getRetrieve browser task resultsJSON text and structuredContent
browser_agent_listPaginated browser historyText and structuredContent
memory_listWhat pre.dev remembers about the user, and with project, that project’s memory and the team’sText lines, each with an [id]
memory_searchKeyword search across the user’s memoryText lines, each with an [id] and where it lives
memory_rememberSave one lasting preferenceText with the saved entry’s [id]
memory_forgetRemove one entry by idText confirmation

Generation and browser execution consume credits. Retrieval and listing do not launch new work. The memory tools use no credits and work on every plan, Free included. The server marks browser execution as potentially destructive because a task can click, submit forms, or change data on external sites.

The local pre.dev MCP server (npx -y @predotdev/mcp setup) lists these tools, passed through on your key, alongside 17 chrome_* tools that drive the Chrome on your own computer, with your profiles and logins; see Browser Agents Local. The browser_agent tools always run tasks on pre.dev’s cloud browsers.

fast_spec and deep_spec

Both tools accept the same parameters:

ParameterRequiredTypeMeaning
executiveSummaryYesString, minimum 10 charactersWhat to specify
existingContextNoStringExisting code, stack, constraints, and architecture as text
docURLsNoArray of URL stringsReference documentation
{
  "executiveSummary": "Add CSV exports to the reporting dashboard.",
  "existingContext": "An existing TypeScript app with a reports API and organization-scoped access.",
  "docURLs": ["https://www.rfc-editor.org/rfc/rfc4180"]
}

These MCP tools do not take REST’s input, currentContext, file, or async fields. They may return before generation finishes. If the result provides a specification ID, call get_spec until its status is completed or failed.

Generation results are text, not the REST SpecResponse JSON envelope. A progress notification reaching 100 does not replace a terminal status check.

get_spec

{ "specId": "507f1f77bcf86cd799439011" }

specId is required. Use the ID returned by generation or listing. A successful structuredContent contains specId and status; it may also include endpoint, created, executionTimeMs, progress, specUrl, predevUrl, output, errorMessage, and creditsUsed, the credits recorded for the spec’s project so far.

output is specification Markdown, preferring the coding-agent variant. Status is pending, processing, completed, failed, or unknown. Optional values may be absent while generation is running.

A completed result also carries plan when its project has one: the project’s verified plan (the same object get_plan returns), and the text ends with the plan as Markdown.

list_specs

ParameterTypeDefaultValues
limitNumber201–100
skipNumber0Zero or greater
endpointStringAllfast_spec, deep_spec
statusStringAllpending, processing, completed, failed

For nonempty pages, structuredContent contains specs, total, hasMore, skip, and limit. Each entry uses specId, not REST’s _id. Use get_spec for the full body. An empty page returns a text-only result.

There is no find_specs MCP tool; use REST search.

get_plan

{ "specId": "507f1f77bcf86cd799439011" }

Pass exactly one of specId (from generation or listing) or projectId. The result is the project’s verified plan: what the app is for, each feature’s status from pre.dev’s checks, progress, what is left, whether it is ready to launch with a plain fix for each open item, where screens, API routes and stored data live in the code (file and line), and what the last change did.

The text content is the plan as Markdown, written for a coding agent to read before working on the project. structuredContent contains projectId, specId, plan and markdown; plan has the same fields as the REST plan and is null while the project has nothing planned or built yet.

Feature statusMeaning
worksA check of this feature passed at the current code
built_not_checkedThe code is there; nothing has proven it yet
changed_since_checkIts files changed after its check passed
needs_a_lookIts check failed the last time it ran
not_workingIts check keeps failing
in_progress, plannedNot built yet
out_of_scopeSet outside the project’s scope; listed, not counted
removedTaken out because the owner asked; listed, not counted

An organization key reads its organization’s projects; any other key reads only its own. Another account’s ID returns an error result (isError: true), the same as an ID that does not exist. Retrieval does not use credits.

browser_agent

ParameterRequiredTypeMeaning
tasksYesNonempty arrayOne object per browser task
concurrencyNoNumber, 1–20Parallel task allowance within this run; default 5
asyncNoBooleanReturn the run ID without waiting for results

Each task supports:

FieldTypeMeaning
urlString, requiredStarting URL
instructionStringGoal to accomplish
inputObject of string valuesForm fields or other task inputs
outputJSON SchemaExpected output shape
successConditionStringNatural-language completion condition
modeauto, extract, agentAutomatic routing, schema extraction, or goal-driven navigation
maxStepsInteger, 1–50Planning-iteration budget
maxDurationSecondsInteger, 5–600Per-task execution budget in seconds

Limits apply to each task. Set explicit budgets for long flows; defaults can vary by task and execution mode. Your account’s in-flight limit also applies to the whole submission.

Synchronous execution returns a text summary, which truncates task data. Retrieve browser_agent_get for full structured results. Async execution returns the ID in text so you can poll it.

The MCP tool has no stream or idempotencyKey input and no cancellation operation; closing the client does not stop browser work. It emits live notifications during synchronous execution when the client supports them. The same credit, batch-size, and account in-flight gates apply as in REST.

Extract structured data

{
  "tasks": [{
    "url": "https://example.com",
    "instruction": "Extract the main page heading.",
    "output": {
      "type": "object",
      "properties": { "heading": { "type": "string" } },
      "required": ["heading"]
    },
    "mode": "extract",
    "maxSteps": 10,
    "maxDurationSeconds": 120
  }]
}

The tool returns a text summary and run ID. Call browser_agent_get with that ID for the complete structuredContent, including results[i].data.

Run a longer workflow

For a multi-step workflow, use mode: "agent", give a concrete completion condition, and submit asynchronously:

{
  "tasks": [{
    "url": "https://news.ycombinator.com/newest",
    "instruction": "Open the next page using More, then collect the first five story titles and links.",
    "successCondition": "The next page has been opened and five stories from that page have been collected.",
    "output": {
      "type": "object",
      "properties": {
        "stories": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "title": { "type": "string" },
              "url": { "type": "string" }
            },
            "required": ["title", "url"]
          },
          "minItems": 5,
          "maxItems": 5
        }
      },
      "required": ["stories"]
    },
    "mode": "agent",
    "maxSteps": 20,
    "maxDurationSeconds": 180
  }],
  "async": true
}

Save the ID from the returned text, then call browser_agent_get every few seconds. Stop when batch status becomes completed or failed, and inspect each task’s uppercase status. A completed batch does not mean every task succeeded.

browser_agent_get

{ "id": "507f1f77bcf86cd799439011", "includeEvents": false }

id is required; includeEvents is optional and defaults to false. structuredContent contains the browser run, including individual task outcomes and extracted data. Set includeEvents to true to retrieve timelines and any available screenshots. During synchronous execution, clients with logging support also receive notifications/message; these are MCP notification envelopes, not REST SSE frames, and heavy event data may be shortened.

browser_agent_list

ParameterTypeDefaultValues
limitNumber201–100
skipNumber0Use a nonnegative offset
statusStringAllprocessing, completed

The structured result contains total and batches. Each batch has id, status, total, completed, and totalCreditsUsed. Unlike REST listing, this tool does not return hasMore; compare your offset and page length with total.

memory_list

{ "project": "Billing dashboard" }

project is optional: a pre.dev project name or id, up to 200 characters. A name matches exactly first, then in part; when more than one project matches, the result lists them and asks for the id.

Without project, the result is your memory for all your projects, then the projects that have their own memory, with how many entries each holds. With project, it is exactly what pre.dev uses in a chat there: your team’s entries (Required ones marked [REQUIRED]), the project’s memory, then yours. Required team entries win, and project or team memory wins over personal memory when they disagree.

Each entry is one text line that starts with its 24-character id, for example - [65f0c3a1b2c4d5e6f7a8b9c0] Use pnpm, not npm. A long list ends with how many entries were left out; find those with memory_search. The server’s instructions ask agents to call memory_list before they answer or write anything, with the project named like the folder they are in, and to follow it.

{ "query": "package manager" }

query is required, 1 to 500 characters of keywords. It searches your memory, the memory of your projects, and your team’s, and returns up to 20 matching lines. Each line has the entry’s [id] and where it lives: (the user), (project <name>), (team), or (team, REQUIRED).

memory_remember

{ "text": "Use pnpm, not npm.", "project": "Billing dashboard" }
ParameterRequiredTypeMeaning
textYesString, 1 to 1,000 charactersOne lasting preference or fact, in one or two short sentences
projectNoStringA pre.dev project name or id, to save it to that project instead of your memory for all your projects

Without project, the entry goes to your memory for all your projects; signed in to a team, it applies to that team’s projects only. The result names where it was saved and the new entry’s [id]. Text that is already in memory is not saved twice, and passwords, API keys, tokens, and private keys are refused. Use it for preferences the user states, not for notes about a single task.

memory_forget

{ "id": "65f0c3a1b2c4d5e6f7a8b9c0" }

id is required: an entry id from memory_list or memory_search, with or without its brackets. The entry is archived, not deleted, so the user can restore it from Archived on the Memory page.

Memory belongs to one person, so the memory tools act as whoever signed in or owns the key. A key shared by a whole team gets an error result that says so. Refusals, such as a secret or an unknown project, return isError: true with the reason in text. See Memory for what each kind of memory is and who can see it.

Notifications and errors

The server sends notifications/message with params: { level, logger, data }. Browser messages contain a task index and event details; large screenshot and DOM values can be elided. Specification messages report phases such as start, generating, and packaging.

To receive notifications/progress, include a progressToken in the tools/call request’s _meta:

{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "browser_agent",
    "arguments": {
      "tasks": [{ "url": "https://example.com", "instruction": "Read the page heading." }]
    },
    "_meta": { "progressToken": "heading-run" }
  }
}

Browser failures return isError: true when the tool call itself fails. Specification tools can return an error in text without isError; inspect the content and retrieve the specification status where an ID is available. Disconnecting or cancelling notification delivery does not cancel the underlying browser run.

Deprecated aliases

Older nameCurrent name
browser_taskbrowser_agent
browser_task_getbrowser_agent_get
browser_task_listbrowser_agent_list

The aliases remain registered for compatibility; the local server keeps them callable but does not list them. Use the current names in new integrations. Credits, queue status, and live browser URL retrieval are available through REST rather than dedicated MCP tools.

Was this page helpful?

On this page