> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to the SpecStream MCP server

The SpecStream MCP connector routes your AI agent's tool calls to SpecStream's own MCP server through Scalekit. Each user signs in to SpecStream once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 61 tools.

**Authentication:** OAuth 2.1/DCR
**Categories:** Search, AI, CRM & Sales
**Tools:** 61: 36 read, 15 write, 10 destructive
**Users sign in with:** OAuth
**OAuth app:** Your own SpecStream MCP server app
**Built by:** Vendor MCP
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=SPECSTREAMMCP)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the SpecStream MCP connection

   In **AgentKit > Connections**, create a SpecStream MCP connection and copy its redirect URI. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

4. ### Register an OAuth app

   SpecStream MCP server connections use your own OAuth app. Register one with SpecStream MCP server and add the redirect URI you copied.

   Then enter the app's Client ID and Client Secret on the SpecStream MCP connection.

5. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   import { ScalekitClient } from '@scalekit-sdk/node'
   import 'dotenv/config'
   import { createInterface } from 'node:readline/promises'

   const scalekit = new ScalekitClient(
     process.env.SCALEKIT_ENVIRONMENT_URL,
     process.env.SCALEKIT_CLIENT_ID,
     process.env.SCALEKIT_CLIENT_SECRET,
   )
   const actions = scalekit.actions

   const connector = 'specstreammcp'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize SpecStream MCP:', link)
   const rl = createInterface({ input: process.stdin, output: process.stdout })
   await rl.question('Press Enter after authorizing...')
   rl.close()

   // Make your first call
   const result = await actions.executeTool({
     connector,
     identifier,
     toolName: 'specstreammcp_get_capacity_balance',
     toolInput: {},
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "specstreammcp"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize SpecStream MCP:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="specstreammcp_get_capacity_balance",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user signs in once. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'specstreammcp_compile',
  toolInput: {
    q: '<q>',
  },
  connector: 'specstreammcp',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="specstreammcp_compile",
    tool_input={
        "q": "<q>",
    },
    connection_name="specstreammcp",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `specstreammcp_compile`

Understand a request · Read-only

Read a request for a list, written in everyday words in any language: companies and local businesses, products and stores, jobs, papers, clinical trials, grants, tenders, datasets, repositories and packages, apps, books or podcasts. Return how SpecStream understood it: what to find, the conditions every result must meet, the facts to bring back (required or optional), how many, and in what order, with the ast_hash that identifies this reading. To add facts to, extend or refresh a list you have, name it with its parent_find_id and the operation: what it finds and its conditions stay as they are, and only the new facts to bring back or the new count are read. The caller must be allowed to read that list. Nothing runs and nothing is charged.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `q` (`string`, required): The request for a list, written in everyday words in any language. SpecStream reads it and returns how it understood it; nothing runs and nothing is charged.
- `locale` (`string`, optional): The locale code for the request, written as a two-letter language code, a hyphen and a two-letter region code. It defaults to en-US. Default: `en-US`.
- `retained` (`string`, optional): Optional reference to a list you already have, to extend it, add facts to it or refresh it. It names the earlier run and the operation, and what that list finds and its conditions stay as they are.

Example input: `{"q":"<q>"}`

### `specstreammcp_edit_spec`

Change what to find or bring back · Read-only

Change a condition or a fact to bring back without rewording the request. Send the revised reading as ast with the edit operations, and get back a checked reading with a new ast_hash for the next quote. Results that already ran stay as they were.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `ast` (`object`, required): The revised reading of the request, as a structured object, sent together with the edit operations. SpecStream checks it and returns a checked reading with a new ast_hash.
- `operations` (`array`, required): The edit operations that change the conditions or facts to bring back, sent together with ast. Each operation either sets or removes one item.

Example input: `{"ast":{},"operations":[]}`

### `specstreammcp_get_capacity_balance`

Check the balance · Read-only

Read the balance available for work. A balance is not permission to spend: paid work still needs the user's approval of a quote.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`string`, optional): Optional ID of the SpecStream project to scope the balance request to. Leave empty if you are not working inside a project.

Example input: `{}`

### `specstreammcp_get_capacity_quote`

Reopen a quote · Read-only

Read a quote and any work already approved from it.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `quote_id` (`string`, required): TODO

Example input: `{"quote_id":"<quote_id>"}`

### `specstreammcp_get_capacity_request`

Find work already started · Read-only

Return the work started with an idempotency_key, so a retry doesn't start it twice.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `request_key` (`string`, required): TODO
- `project_id` (`string`, optional): TODO

Example input: `{"request_key":"<request_key>"}`

### `specstreammcp_get_collection`

Open a collection · Read-only

Read a collection's records, columns and saved views.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `collection_id` (`string`, required): TODO

Example input: `{"collection_id":"<collection_id>"}`

### `specstreammcp_get_find`

Check on a run · Read-only

Read a run's request, progress, and what it has cost so far. After the user approves a quote, check it until the run finishes.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `find_id` (`string`, required): TODO

Example input: `{"find_id":"<find_id>"}`

### `specstreammcp_get_input_research`

Review imported research · Read-only

Read each original input row, the source-backed identity decision, unresolved namesakes and its delivered record. Name and location are search hints, not verified facts. Use this after researching an imported list; a missing identity must not be guessed or called a Match. No charge or new research.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `find_id` (`string`, required): The ID of the find (also called a run) that researched an imported list. The original input rows, identity decisions and delivered records of that find are read.

Example input: `{"find_id":"<find_id>"}`

### `specstreammcp_get_project`

Open a project · Read-only

Read a project, its members, their roles and their spending limits.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`string`, required): TODO

Example input: `{"project_id":"<project_id>"}`

### `specstreammcp_get_reconciled_input`

Read where filled cells came from · Read-only

Read, for a list made by apply_reconciliation, which chosen pair filled each cell.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `import_id` (`string`, required): The import ID of a list that was made by apply_reconciliation. It is used to read which chosen pair filled each cell of that list.

Example input: `{"import_id":"<import_id>"}`

### `specstreammcp_get_reconciliation`

Read a comparison · Read-only

Read the proposed pairs, alternatives, conflicts and missing values of a comparison. Refuses if either list changed since it was prepared.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `comparison_id` (`string`, required): The ID of the comparison to read, such as one prepared with prepare_reconciliation. Its proposed pairs, alternatives, conflicts and missing values are returned.

Example input: `{"comparison_id":"<comparison_id>"}`

### `specstreammcp_get_reconciliation_fields`

List fields to match on · Read-only

Read the fields of a list the user can open, with examples, to choose which fields to match against another list. Changes nothing.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `collection_id` (`string`, required): The ID of the list (collection) whose fields are read, so you can choose which fields to match against another list.

Example input: `{"collection_id":"<collection_id>"}`

### `specstreammcp_get_spec`

Open a saved request · Read-only

Read a saved request and its current version.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `spec_id` (`string`, required): The ID of the saved request to read. The tool returns that request together with its current version.

Example input: `{"spec_id":"<spec_id>"}`

### `specstreammcp_get_spec_revision`

Open one version · Read-only

Read one earlier version of a saved request, unchanged.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `revision_id` (`string`, required): The ID of one earlier version (revision) of that saved request. That version is read back unchanged.
- `spec_id` (`string`, required): The ID of the saved request that the earlier version belongs to.

Example input: `{"revision_id":"<revision_id>","spec_id":"<spec_id>"}`

### `specstreammcp_get_web_source`

Read a website source · Read-only

Read a saved website source and how each column is read.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `source_id` (`string`, required): TODO

Example input: `{"source_id":"<source_id>"}`

### `specstreammcp_get_web_source_preview`

Read a source preview · Read-only

Read one source preview with its rows, cell locations and field explanations.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `preview_id` (`string`, required): TODO

Example input: `{"preview_id":"<preview_id>"}`

### `specstreammcp_list_activity`

Lists · Read-only

Read what happened across the account and its projects, and who did it.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `cursor` (`string`, optional): TODO
- `limit` (`string`, optional): TODO
- `project_id` (`string`, optional): TODO

Example input: `{}`

### `specstreammcp_list_collections`

List collections · Read-only

List the imported lists and results you can open.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): TODO
- `limit` (`string`, optional): TODO
- `project_id` (`string`, optional): TODO
- `sort` (`string`, optional): TODO

Example input: `{}`

### `specstreammcp_list_find_rows`

Read the results · Read-only

Read the results that met every condition, with the source behind each check, a page at a time; next_cursor is null on the last page. The separate possible list holds candidates with open conditions, which are not results and were not charged.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `find_id` (`string`, required): TODO
- `cursor` (`string`, optional): TODO
- `limit` (`integer`, optional): TODO. Default: `100`.

Example input: `{"find_id":"<find_id>"}`

### `specstreammcp_list_projects`

List projects · Read-only

List the projects you can open, with your role in each.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `cursor` (`string`, optional): TODO
- `limit` (`string`, optional): TODO

Example input: `{}`

### `specstreammcp_list_reconciliations`

List recent comparisons · Read-only

List the latest comparisons that include a list. Comparisons are kept for 30 days; a list filled from one is kept as its own list.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `collection_id` (`string`, required): The ID of the list (collection) to look up comparisons for. The latest comparisons that include this list are returned.

Example input: `{"collection_id":"<collection_id>"}`

### `specstreammcp_list_request_templates`

Start from an example · Read-only

List example requests that already work for each kind of record. Edit one, then understand and quote it before anything runs.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `record_type` (`string`, optional): The kind of record to list example requests for, such as jobs or clinical trials. It is free text of at most 64 characters.

Example input: `{}`

### `specstreammcp_list_specs`

List saved requests · Read-only

List the saved requests you can open.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `archived` (`string`, optional): Whether to filter the saved requests by archived status, with true or false. Leave it unset to apply no archived filter.
- `cursor` (`string`, optional): A pagination token that selects the next page of saved requests. It is taken from the previous page of results.
- `limit` (`string`, optional): The maximum number of saved requests to return in one page. It must be between 1 and 100.
- `project_id` (`string`, optional): The ID of the SpecStream project whose saved requests to list. Leaving it out means your own saved requests.

Example input: `{}`

### `specstreammcp_list_web_sources`

List website sources · Read-only

List the website sources saved in a project.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `specstreammcp_list_your_fields`

Read your fields · Read-only

Read the status, checkbox and text fields your team added to a collection.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `collection_id` (`string`, required): TODO

Example input: `{"collection_id":"<collection_id>"}`

### `specstreammcp_open_list_file`

List file · Read-only

Show a list file the person opened (.csv, .tsv, .xlsx, .geojson or .kml) as a list. The file is never changed.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `file` (`object`, required): TODO

Example input: `{"file":{}}`

### `specstreammcp_open_specstream`

Lists · Read-only

Open your saved lists and request editor in SpecStream.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `specstreammcp_open_specstream_panel`

Selected list · Read-only

Keep your selected list beside the conversation.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `specstreammcp_preview_web_source`

Read a website source again · Read-only

Read a saved source's page again and preview its rows. Earlier lists stay unchanged.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `source_id` (`string`, required): TODO

Example input: `{"source_id":"<source_id>"}`

### `specstreammcp_read_specstream_record_notes`

Read record notes · Read-only

Read record notes. Uses the current account permissions and note version.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `collection_id` (`string`, optional): TODO
- `project_id` (`string`, optional): TODO
- `record_id` (`string`, optional): TODO

Example input: `{}`

### `specstreammcp_read_specstream_settings`

List settings · Read-only

Read this account's list presentation preferences.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `specstreammcp_replay_find_decisions`

Replay the checks · Read-only

Reproduce a run's saved checks from the recorded evidence. No new search and no new charge.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `find_id` (`string`, required): TODO

Example input: `{"find_id":"<find_id>"}`

### `specstreammcp_search_lists`

Find a list or record to mention · Read-only

Search the person's saved lists and records for the composer.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `query` (`string`, optional): TODO. Default: ``.

Example input: `{}`

### `specstreammcp_search_workspace`

Search your work · Read-only

Find records, lists, requests, projects, people, notes and monitors by name or text.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `q` (`string`, required): TODO
- `cursor` (`string`, optional): TODO
- `limit` (`string`, optional): TODO

Example input: `{"q":"<q>"}`

### `specstreammcp_show_specstream_lists`

Your lists · Read-only

Show authorized saved lists as a compact selector inside the conversation.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `specstreammcp_show_specstream_records`

Results · Read-only

Show a list as a card in the conversation, once, when it's ready. Pass the run's find_id or a saved list's id as collection_id. Read rows with list_find_rows first when you need them for your answer: reading shows nothing.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `collection_id` (`string`, required): TODO

Example input: `{"collection_id":"<collection_id>"}`

### `specstreammcp_add_specstream_record_note`

Add a record note · Write

Add a record note. Uses the current account permissions and note version.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `expected_version` (`integer`, required): TODO
- `id` (`string`, required): TODO
- `text` (`string`, required): TODO
- `collection_id` (`string`, optional): TODO
- `project_id` (`string`, optional): TODO
- `record_id` (`string`, optional): TODO

Example input: `{"expected_version":1,"id":"<id>","text":"<text>"}`

### `specstreammcp_apply_reconciliation`

Fill a list from chosen pairs · Write

Only after the user chooses the pairs: fill empty cells into a NEW list from the chosen counterpart rows, using the exact comparison hash. Original cells and lists stay unchanged and unmatched rows are kept. Filled cells are inputs, not checked results; researching them needs a normal quote and approval.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `choices` (`array`, required): The pairs the user chose, each naming a row in the left list and the row in the right list it matches. Send only pairs the user has chosen; a proposed candidate is not a choice.
- `comparison_hash` (`string`, required): The exact hash of the comparison that the chosen pairs were picked from.
- `comparison_id` (`string`, required): The ID of the comparison that the chosen pairs and the comparison hash belong to.
- `import_id` (`string`, required): An ID for the new list this call creates (its import ID). It can later be used to read where each filled cell came from.
- `name` (`string`, required): A name for the new list this call creates from the chosen pairs.

Example input: `{"choices":[],"comparison_hash":"<comparison_hash>","comparison_id":"<comparison_id>","import_id":"<import_id>","name":"<name>"}`

### `specstreammcp_export_find`

Download the results · Write

Create a download link for a run's results as CSV, Excel, JSON or HTML, or KML and GeoJSON for records with places. The link works for 24 hours.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `find_id` (`string`, required): TODO
- `format` (`string`, required): TODO

Example input: `{"find_id":"<find_id>","format":"<format>"}`

### `specstreammcp_import_csv`

Import a CSV or Excel file · Write

Bring in your own list with names, websites, places and any other columns. Nothing is researched or charged. Then quote a find with source_import_id to fill in details or check each row.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `format` (`string`, required): TODO
- `import_id` (`string`, required): TODO
- `name` (`string`, required): TODO
- `content` (`string`, optional): TODO
- `content_base64` (`string`, optional): TODO
- `mapping` (`string`, optional): TODO
- `project_id` (`string`, optional): TODO
- `sheet` (`string`, optional): TODO

Example input: `{"format":"<format>","import_id":"<import_id>","name":"<name>"}`

### `specstreammcp_prepare_reconciliation`

Compare two lists · Write

Propose which rows in one list correspond to rows in another, using matching groups of exact or close-spelling rules (any group can match; every rule in a group must agree) and conflict fields that rule a pair out. Shows alternatives, conflicts and missing values. A close spelling is not proof of the same company, and one candidate is not permission to choose it. No search and no charge.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `fill` (`array`, required): The fields to fill in. Each entry names a field of the right list and the output field that is filled from it.
- `groups` (`array`, required): The matching groups used to propose pairs: a pair of rows matches if any one group matches, and a group matches only when every rule in it agrees. Each rule compares a field in the left list with a field in the right list, exactly or by close spelling.
- `left` (`object`, required): The first list to compare, given as an object with the list's collection ID and, optionally, the record IDs of the rows to include.
- `name` (`string`, required): A short name for this comparison.
- `request_id` (`string`, required): An identifier for this comparison request, 8 to 128 characters long.
- `right` (`object`, required): The second list to compare, given the same way as the left list: its collection ID and, optionally, the record IDs of the rows to include.
- `assignment` (`string`, optional): How rows may be paired: one_to_one (the default) or many_to_one. One of: `one_to_one`, `many_to_one`. Default: `one_to_one`.
- `include_private_fields` (`boolean`, optional): Whether private fields of the lists are included in the comparison. Defaults to false. Default: `false`.
- `project_id` (`string`, optional): Optional ID of the project that keeps the lists. Leaving it out means the user's own lists.
- `vetoes` (`array`, optional): Optional conflict fields. If a pair's values in the two named fields conflict, the pair is ruled out.

Example input: `{"fill":[],"groups":[],"left":{},"name":"<name>","request_id":"<request_id>","right":{}}`

### `specstreammcp_quote_imported_list`

Price filling in an imported list · Write

Price filling in missing details or checking each row of a list the user imported. The quote shows the most it can cost and when the quote expires. Nothing runs and nothing is spent.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `ast_hash` (`string`, required): The ast_hash of the reading that says what to fill in or check.
- `source_import_id` (`string`, required): The imported list, from import_csv.
- `source_row_ids` (`array`, required): The imported rows to fill in or check.
- `project_id` (`string`, optional): The project that keeps the list. Leave it out for the user's own lists.

Example input: `{"ast_hash":"<ast_hash>","source_import_id":"<source_import_id>","source_row_ids":[]}`

### `specstreammcp_quote_more_facts`

Price more facts · Write

Price bringing back more facts for results the user already has, after edit_spec added them to the list's request. The quote shows the most it can cost and when the quote expires. Nothing runs and nothing is spent.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `ast_hash` (`string`, required): The ast_hash from edit_spec after adding the facts to the list's request.
- `find_id` (`string`, required): The list to add facts to.
- `selected_entity_ids` (`string`, optional): Only these results, by entity_id. Leave it out for every result.

Example input: `{"ast_hash":"<ast_hash>","find_id":"<find_id>"}`

### `specstreammcp_quote_more_results`

Price more results · Write

Price more results for a list the user has, from the same request. Results already in the list aren't bought again. The quote shows the most it can cost and when the quote expires. Nothing runs and nothing is spent.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `find_id` (`string`, required): The list to add results to.
- `requested_units` (`string`, optional): How many more results to price. Leave it out for 25.

Example input: `{"find_id":"<find_id>"}`

### `specstreammcp_quote_new_list`

Price a new list · Write

Price a new list for a request read by compile or edit_spec, before anything runs. The quote shows the most it can cost and when the quote expires. Nothing runs and nothing is spent.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `ast_hash` (`string`, required): The ast_hash of the reading from compile or edit_spec.
- `project_id` (`string`, optional): The project that keeps the list. Leave it out for the user's own lists.
- `requested_units` (`string`, optional): How many results to price. Leave it out to price the number the request asks for.

Example input: `{"ast_hash":"<ast_hash>"}`

### `specstreammcp_quote_refresh`

Price a refresh · Write

Price checking a list's results again against the live web, to catch what changed. The quote shows the most it can cost and when the quote expires. Nothing runs and nothing is spent.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `find_id` (`string`, required): The list to check again.
- `selected_entity_ids` (`string`, optional): Only these results, by entity_id. Leave it out for every result.

Example input: `{"find_id":"<find_id>"}`

### `specstreammcp_resolve_specstream_record_note`

Resolve a record note · Write

Resolve a record note. Uses the current account permissions and note version.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `expected_version` (`integer`, required): TODO
- `note_id` (`string`, required): TODO
- `resolved` (`boolean`, required): TODO
- `collection_id` (`string`, optional): TODO
- `project_id` (`string`, optional): TODO
- `record_id` (`string`, optional): TODO

Example input: `{"expected_version":1,"note_id":"<note_id>","resolved":true}`

### `specstreammcp_save_web_source_list`

Save a source preview as a list · Write

Save a preview the user reviewed as an imported list, using its preview hash. Saving does not research or spend.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `import_id` (`string`, required): TODO
- `name` (`string`, required): TODO
- `preview_hash` (`string`, required): TODO
- `preview_id` (`string`, required): TODO
- `mapping` (`object`, optional): TODO

Example input: `{"import_id":"<import_id>","name":"<name>","preview_hash":"<preview_hash>","preview_id":"<preview_id>"}`

### `specstreammcp_set_your_field`

Mark records · Write

Set or clear one of your own fields on the records you choose, like a status of Called.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `collection_id` (`string`, required): TODO
- `expected_version` (`integer`, required): TODO
- `key` (`string`, required): TODO
- `record_ids` (`array`, required): TODO
- `value` (`string`, optional): TODO

Example input: `{"collection_id":"<collection_id>","expected_version":1,"key":"<key>","record_ids":[]}`

### `specstreammcp_teach_web_source`

Teach a website source · Write

Read one public page and learn its records from 3 to 8 example rows the user copied from it. Show the user the preview's explanation: how each field is read, which rows are their examples and which were inferred, and what happens when the page changes.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `examples` (`array`, required): TODO
- `name` (`string`, required): TODO
- `url` (`string`, required): TODO
- `exclude` (`array`, optional): TODO
- `name_column` (`string`, optional): TODO. Default: `name`.
- `project_id` (`string`, optional): TODO

Example input: `{"examples":[],"name":"<name>","url":"<url>"}`

### `specstreammcp_update_specstream_settings`

Save list settings · Write

Save this account's list layout or order. No research or account permissions change.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `set` (`object`, required): TODO

Example input: `{"set":{}}`

### `specstreammcp_cancel_find`

Stop a run · Destructive

Ask a run in progress to stop. It keeps what it already found.

Read only: no. Destructive: yes. Idempotent (safe to retry): no.

Inputs:

- `find_id` (`string`, required): TODO

Example input: `{"find_id":"<find_id>"}`

### `specstreammcp_delete_specstream_record_note`

Remove a record note · Destructive

Remove a record note. Uses the current account permissions and note version.

Read only: no. Destructive: yes. Idempotent (safe to retry): no.

Inputs:

- `expected_version` (`integer`, required): TODO
- `note_id` (`string`, required): TODO
- `collection_id` (`string`, optional): TODO
- `project_id` (`string`, optional): TODO
- `record_id` (`string`, optional): TODO

Example input: `{"expected_version":1,"note_id":"<note_id>"}`

### `specstreammcp_edit_specstream_record_note`

Edit your record note · Destructive

Edit your record note. Uses the current account permissions and note version.

Read only: no. Destructive: yes. Idempotent (safe to retry): no.

Inputs:

- `expected_version` (`integer`, required): TODO
- `note_id` (`string`, required): TODO
- `text` (`string`, required): TODO
- `collection_id` (`string`, optional): TODO
- `project_id` (`string`, optional): TODO
- `record_id` (`string`, optional): TODO

Example input: `{"expected_version":1,"note_id":"<note_id>","text":"<text>"}`

### `specstreammcp_revoke_share`

Stop sharing results · Destructive

Turn off a shared results link.

Read only: no. Destructive: yes. Idempotent (safe to retry): no.

Inputs:

- `share_id` (`string`, required): TODO

Example input: `{"share_id":"<share_id>"}`

### `specstreammcp_run_imported_list`

Fill in an imported list · Destructive

Fill in or check the imported rows from a quote the user approved. SpecStream reads the live web and charges only for delivered results, never more than the approved amount. The same idempotency_key returns the same run instead of a second one. It refuses a quote priced for another job.

Read only: no. Destructive: yes. Idempotent (safe to retry): no.

Inputs:

- `confirm_max_cents` (`integer`, required): The most the user approved, in cents. It can't be below the quote.
- `idempotency_key` (`string`, required): A key that stays the same if this call is retried, so the work starts once.
- `quote_hash` (`string`, required): The quote's quote_hash.
- `quote_id` (`string`, required): The quote the user approved.

Example input: `{"confirm_max_cents":1,"idempotency_key":"<idempotency_key>","quote_hash":"<quote_hash>","quote_id":"<quote_id>"}`

### `specstreammcp_run_more_facts`

Add facts to a list · Destructive

Add the new facts to the list's results from a quote the user approved. SpecStream reads the live web and charges only for delivered results, never more than the approved amount. The same idempotency_key returns the same run instead of a second one. It refuses a quote priced for another job.

Read only: no. Destructive: yes. Idempotent (safe to retry): no.

Inputs:

- `confirm_max_cents` (`integer`, required): The most the user approved, in cents. It can't be below the quote.
- `idempotency_key` (`string`, required): A key that stays the same if this call is retried, so the work starts once.
- `quote_hash` (`string`, required): The quote's quote_hash.
- `quote_id` (`string`, required): The quote the user approved.

Example input: `{"confirm_max_cents":1,"idempotency_key":"<idempotency_key>","quote_hash":"<quote_hash>","quote_id":"<quote_id>"}`

### `specstreammcp_run_more_results`

Get more results · Destructive

Add more results to a list from a quote the user approved. SpecStream reads the live web and charges only for delivered results, never more than the approved amount. The same idempotency_key returns the same run instead of a second one. It refuses a quote priced for another job.

Read only: no. Destructive: yes. Idempotent (safe to retry): no.

Inputs:

- `confirm_max_cents` (`integer`, required): The most the user approved, in cents. It can't be below the quote.
- `idempotency_key` (`string`, required): A key that stays the same if this call is retried, so the work starts once.
- `quote_hash` (`string`, required): The quote's quote_hash.
- `quote_id` (`string`, required): The quote the user approved.

Example input: `{"confirm_max_cents":1,"idempotency_key":"<idempotency_key>","quote_hash":"<quote_hash>","quote_id":"<quote_id>"}`

### `specstreammcp_run_new_list`

Run a new list · Destructive

Start a new list from a quote the user approved. SpecStream reads the live web and charges only for delivered results, never more than the approved amount. The same idempotency_key returns the same run instead of a second one. It refuses a quote priced for another job.

Read only: no. Destructive: yes. Idempotent (safe to retry): no.

Inputs:

- `confirm_max_cents` (`integer`, required): The most the user approved, in cents. It can't be below the quote.
- `idempotency_key` (`string`, required): A key that stays the same if this call is retried, so the work starts once.
- `quote_hash` (`string`, required): The quote's quote_hash.
- `quote_id` (`string`, required): The quote the user approved.

Example input: `{"confirm_max_cents":1,"idempotency_key":"<idempotency_key>","quote_hash":"<quote_hash>","quote_id":"<quote_id>"}`

### `specstreammcp_run_refresh`

Refresh a list · Destructive

Check the list's results again from a quote the user approved. SpecStream reads the live web and charges only for delivered results, never more than the approved amount. The same idempotency_key returns the same run instead of a second one. It refuses a quote priced for another job.

Read only: no. Destructive: yes. Idempotent (safe to retry): no.

Inputs:

- `confirm_max_cents` (`integer`, required): The most the user approved, in cents. It can't be below the quote.
- `idempotency_key` (`string`, required): A key that stays the same if this call is retried, so the work starts once.
- `quote_hash` (`string`, required): The quote's quote_hash.
- `quote_id` (`string`, required): The quote the user approved.

Example input: `{"confirm_max_cents":1,"idempotency_key":"<idempotency_key>","quote_hash":"<quote_hash>","quote_id":"<quote_id>"}`

### `specstreammcp_share_find`

Share results · Destructive

Create a link to a fixed copy of a run's results that anyone with the link can open.

Read only: no. Destructive: yes. Idempotent (safe to retry): no.

Inputs:

- `find_id` (`string`, required): TODO
- `include_contacts` (`boolean`, optional): TODO. Default: `true`.

Example input: `{"find_id":"<find_id>"}`

## Related

Other Search connectors ([all 43](/agentkit/connectors/?category=search)):

- [Supadata](/agentkit/connectors/supadata/): Scalekit connector, API key, 21 tools
- [Exa](/agentkit/connectors/exa/): Scalekit connector, API key, 21 tools
- [Brave Search](/agentkit/connectors/brave/): Scalekit connector, API key, 18 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
