@specstream/openclaw-plugin 0.1.2 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -11
- package/dist/client.js +22 -1
- package/dist/index.js +142 -5
- package/openclaw.plugin.json +10 -2
- package/package.json +5 -3
- package/skills/specstream-extract-pages/SKILL.md +11 -0
- package/skills/specstream-web-search/SKILL.md +13 -0
package/README.md
CHANGED
|
@@ -1,9 +1,18 @@
|
|
|
1
1
|
# @specstream/openclaw-plugin
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[SpecStream](https://specstream.ai) is the live web data engine. One platform to build, search, extract, enrich, map, and monitor data across the entire web.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Ask for any dataset in plain words, and SpecStream builds it from the entire live web: every match found, extracted and enriched into structured records, then monitored for change. It runs through the API and MCP, and inside Sheets, CRMs, Slack, n8n, Zapier and the other tools teams already use.
|
|
6
6
|
|
|
7
|
+
Source URL and read time on every value.
|
|
8
|
+
|
|
9
|
+
Three products:
|
|
10
|
+
|
|
11
|
+
1. Search API: `GET /v1/web-search`, $5 per 1,000 searches. The most accurate web search API in the world (scores and method: https://specstream.ai/benchmarks).
|
|
12
|
+
2. Extract API: `POST /v1/extract`, up to 20 URLs a call (web pages, PDF, Word, Excel), $0.80 per 1,000 pages. A page with no text is not charged.
|
|
13
|
+
3. Deep Search: ask in plain words and get every match on the live web, in structured rows, priced per row (5 cents, 15 cents or $1 a row, plus 5 cents for a person's email and 15 cents for a phone). A run that finds nothing costs nothing.
|
|
14
|
+
|
|
15
|
+
This plugin gives OpenClaw four tools (`specstream_web_search`, `specstream_extract_pages`, `specstream_find_list`, `specstream_get_list_rows`), registers SpecStream as an OpenClaw web search and web fetch provider, and ships six skills for the hosted MCP server.
|
|
7
16
|
## Install
|
|
8
17
|
|
|
9
18
|
From ClawHub:
|
|
@@ -22,7 +31,7 @@ Needs OpenClaw 2026.10.3 or newer.
|
|
|
22
31
|
|
|
23
32
|
## Set it up
|
|
24
33
|
|
|
25
|
-
Create an API key under **Agents & API** in your [SpecStream workspace](https://specstream.ai/workspace). New accounts start with $10 of
|
|
34
|
+
Create an API key under **Agents & API** in your [SpecStream workspace](https://specstream.ai/workspace). New accounts start with $10 of credit for 30 days, no card.
|
|
26
35
|
|
|
27
36
|
The plugin reads the key from `SPECSTREAM_API_KEY`. To keep it in your OpenClaw config instead, store a SecretRef that points at the variable:
|
|
28
37
|
|
|
@@ -47,6 +56,24 @@ Give the key only what the task needs: its scope, projects, an expiry and a spen
|
|
|
47
56
|
|
|
48
57
|
## The tools
|
|
49
58
|
|
|
59
|
+
### `specstream_web_search`
|
|
60
|
+
|
|
61
|
+
| Input | |
|
|
62
|
+
| --- | --- |
|
|
63
|
+
| `q` | The search question or request in everyday words (1 to 2,000 characters). Quoted phrases are searched as phrases |
|
|
64
|
+
| `passages` | Optional. Set `true` to include the main text passages of the top matching pages |
|
|
65
|
+
|
|
66
|
+
Calls `GET /v1/web-search` ($5 per 1,000 searches, no quote needed). Returns `kind` (`fact` or `list`), `answer` (with `value`, `page` and `seen_at`), `rows`, ranked `sources` and optional `passages`.
|
|
67
|
+
|
|
68
|
+
### `specstream_extract_pages`
|
|
69
|
+
|
|
70
|
+
| Input | |
|
|
71
|
+
| --- | --- |
|
|
72
|
+
| `urls` | 1 to 20 `http` or `https` URLs (web pages, PDF, Word, Excel) |
|
|
73
|
+
| `format` | Optional. `"markdown"` (default) or `"text"` |
|
|
74
|
+
|
|
75
|
+
Calls `POST /v1/extract` ($0.80 per 1,000 pages, a page with no text is free, no quote needed). Returns `results` with `url`, `status`, `title`, `published`, `read_from` and `text` for each URL.
|
|
76
|
+
|
|
50
77
|
### `specstream_find_list`
|
|
51
78
|
|
|
52
79
|
| Input | |
|
|
@@ -55,7 +82,7 @@ Give the key only what the task needs: its scope, projects, an expiry and a spen
|
|
|
55
82
|
| `max_results` | How many rows, 1 to 1000. Default 25 |
|
|
56
83
|
| `max_price_usd` | Optional. A lower ceiling for this call |
|
|
57
84
|
|
|
58
|
-
The tool reads the request, gets the price, and starts the run only if the quoted maximum is within your ceiling. The agent can ask for a lower ceiling on a call and can never raise yours. If the price is above the ceiling, nothing runs and the agent is told so. Results cost
|
|
85
|
+
The tool reads the request, gets the price, and starts the run only if the quoted maximum is within your ceiling. The agent can ask for a lower ceiling on a call and can never raise yours. If the price is above the ceiling, nothing runs and the agent is told so. Results cost 5 cents, 15 cents or $1 each depending on the list, plus 5 cents for a person's email and 15 cents for a phone number, and nothing when nothing matches.
|
|
59
86
|
|
|
60
87
|
It waits for the list, then returns JSON: `state`, `list_id`, `list_link` and `rows`. Each row has its columns plus `source_url` and `checked_at`. A retry of the same request with the same limits within the hour reaches the run it already started, so a flaky turn does not buy the list twice.
|
|
61
88
|
|
|
@@ -65,7 +92,7 @@ Reads every row of a list you already own, by `list_id`. Free. Use it when a big
|
|
|
65
92
|
|
|
66
93
|
## Skills and the SpecStream server (optional)
|
|
67
94
|
|
|
68
|
-
The plugin ships
|
|
95
|
+
The plugin ships six skills: `specstream-web-search` (Search API), `specstream-extract-pages` (Extract API), `specstream-compile` (show how SpecStream read a dataset request), `specstream-review-work` (get the price), `specstream-approve-work` (approve it) and `specstream-continue-work` (read the rows, send them to Sheets, Notion, HubSpot and more, keep them up to date). They use the hosted SpecStream server and stay hidden until you add it:
|
|
69
96
|
|
|
70
97
|
```sh
|
|
71
98
|
openclaw mcp set specstream '{"url":"https://api.specstream.ai/mcp","transport":"streamable-http","auth":"oauth"}'
|
|
@@ -74,12 +101,6 @@ openclaw mcp login specstream
|
|
|
74
101
|
|
|
75
102
|
The tools above work without it.
|
|
76
103
|
|
|
77
|
-
## Example
|
|
78
|
-
|
|
79
|
-
> Find food banks in Texas with their annual revenue. Keep it under $3.
|
|
80
|
-
|
|
81
|
-
The agent calls `specstream_find_list` with `max_price_usd: 3`, and you get a table of food banks, each row with the page it came from, plus a link to open the list in your workspace.
|
|
82
|
-
|
|
83
104
|
## Develop
|
|
84
105
|
|
|
85
106
|
```sh
|
package/dist/client.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/** The SpecStream REST calls the tools share: read a request, price it, start it within a maximum, read its rows. */
|
|
2
2
|
export const BASE_URL = "https://api.specstream.ai";
|
|
3
|
-
export const USER_AGENT = "@specstream/openclaw-plugin/0.
|
|
3
|
+
export const USER_AGENT = "@specstream/openclaw-plugin/0.2.0";
|
|
4
4
|
/** A list runs for up to about five minutes, so the default wait is just under that. */
|
|
5
5
|
export const DEFAULT_WAIT_SECONDS = 300;
|
|
6
6
|
export const DEFAULT_POLL_INTERVAL_SECONDS = 3;
|
|
@@ -146,6 +146,27 @@ export class SpecStreamClient {
|
|
|
146
146
|
throw new SpecStreamError("SpecStream returned a response this plugin could not read.");
|
|
147
147
|
return data;
|
|
148
148
|
}
|
|
149
|
+
/** Search the live web with GET /v1/web-search ($5 per 1,000 searches, no quote needed). */
|
|
150
|
+
async webSearch(query, options = {}) {
|
|
151
|
+
const q = (query ?? "").trim();
|
|
152
|
+
if (!q)
|
|
153
|
+
throw new Error("Provide a search query in q.");
|
|
154
|
+
if (q.length > 2000)
|
|
155
|
+
throw new Error("q must be at most 2,000 characters.");
|
|
156
|
+
const params = new URLSearchParams({ q });
|
|
157
|
+
if (options.passages)
|
|
158
|
+
params.set("passages", "true");
|
|
159
|
+
return (await this.request("GET", `/v1/web-search?${params}`, undefined, { abortSignal: options.abortSignal })) ?? {};
|
|
160
|
+
}
|
|
161
|
+
/** Extract the main text of up to 20 URLs live with POST /v1/extract ($0.80 per 1,000 pages, empty pages free). */
|
|
162
|
+
async extractPages(urls, options = {}) {
|
|
163
|
+
const cleaned = (Array.isArray(urls) ? urls : []).map((u) => String(u ?? "").trim()).filter(Boolean);
|
|
164
|
+
if (cleaned.length < 1 || cleaned.length > 20) {
|
|
165
|
+
throw new Error("Provide 1 to 20 http or https URLs in urls.");
|
|
166
|
+
}
|
|
167
|
+
const format = options.format === "text" ? "text" : "markdown";
|
|
168
|
+
return ((await this.request("POST", "/v1/extract", { urls: cleaned, format }, { abortSignal: options.abortSignal })) ?? {});
|
|
169
|
+
}
|
|
149
170
|
/** Every row found so far for a list, following the pages. Reading is free. */
|
|
150
171
|
async results(findId, abortSignal) {
|
|
151
172
|
const rows = [];
|
package/dist/index.js
CHANGED
|
@@ -12,19 +12,67 @@ const configSchema = Type.Object({
|
|
|
12
12
|
})),
|
|
13
13
|
waitSeconds: Type.Optional(Type.Integer({ minimum: 10, maximum: 900, description: "How long specstream_find_list waits for a running list. Defaults to 300." })),
|
|
14
14
|
}, { additionalProperties: false });
|
|
15
|
-
|
|
15
|
+
const entry = defineToolPlugin({
|
|
16
16
|
id: "specstream",
|
|
17
17
|
name: "SpecStream",
|
|
18
|
-
description: "
|
|
18
|
+
description: "The live web data engine. One platform to build, search, extract, enrich, map, and monitor data across the entire web. Source URL and read time on every value.",
|
|
19
19
|
activation: { onStartup: false },
|
|
20
20
|
configSchema,
|
|
21
21
|
tools: (tool) => [
|
|
22
|
+
tool({
|
|
23
|
+
name: "specstream_web_search",
|
|
24
|
+
label: "Search the web",
|
|
25
|
+
description: [
|
|
26
|
+
"Search the live web in seconds with the SpecStream Search API (GET /v1/web-search, $5 per 1,000 searches, no quote needed).",
|
|
27
|
+
"Use it for a single fact, a question with sources, or to see the first rows of a request before pricing a full Deep Search dataset.",
|
|
28
|
+
"Returns JSON with kind ('fact' or 'list'), answer (value, page and seen_at), rows, ranked sources, and optional page passages.",
|
|
29
|
+
].join(" "),
|
|
30
|
+
parameters: Type.Object({
|
|
31
|
+
q: Type.String({
|
|
32
|
+
minLength: 1,
|
|
33
|
+
maxLength: 2000,
|
|
34
|
+
description: "The search question or request in everyday words (1 to 2,000 characters). Quoted phrases are searched as phrases.",
|
|
35
|
+
}),
|
|
36
|
+
passages: Type.Optional(Type.Boolean({
|
|
37
|
+
description: "Set true to include the main text passages of the top matching pages in the response.",
|
|
38
|
+
})),
|
|
39
|
+
}),
|
|
40
|
+
execute: async ({ q, passages }, config, { signal }) => {
|
|
41
|
+
const settings = resolveConfig(config);
|
|
42
|
+
const client = new SpecStreamClient({ apiKey: settings.apiKey });
|
|
43
|
+
return client.webSearch(q, { passages, abortSignal: signal });
|
|
44
|
+
},
|
|
45
|
+
}),
|
|
46
|
+
tool({
|
|
47
|
+
name: "specstream_extract_pages",
|
|
48
|
+
label: "Extract pages",
|
|
49
|
+
description: [
|
|
50
|
+
"Read the main text, title and published date of 1 to 20 web pages, PDFs, Word documents or Excel spreadsheets live with the SpecStream Extract API (POST /v1/extract, $0.80 per 1,000 pages).",
|
|
51
|
+
"A page that returns no text is not charged, and no quote or approval is needed.",
|
|
52
|
+
"Returns JSON with results (one entry per URL: url, status, title, published, read_from and text), took_ms and price_usd.",
|
|
53
|
+
].join(" "),
|
|
54
|
+
parameters: Type.Object({
|
|
55
|
+
urls: Type.Array(Type.String({ minLength: 1 }), {
|
|
56
|
+
minItems: 1,
|
|
57
|
+
maxItems: 20,
|
|
58
|
+
description: "1 to 20 http or https URLs to read live.",
|
|
59
|
+
}),
|
|
60
|
+
format: Type.Optional(Type.Union([Type.Literal("markdown"), Type.Literal("text")], {
|
|
61
|
+
description: 'Output format: "markdown" (default, keeps headings, lists and links) or "text".',
|
|
62
|
+
})),
|
|
63
|
+
}),
|
|
64
|
+
execute: async ({ urls, format }, config, { signal }) => {
|
|
65
|
+
const settings = resolveConfig(config);
|
|
66
|
+
const client = new SpecStreamClient({ apiKey: settings.apiKey });
|
|
67
|
+
return client.extractPages(urls, { format, abortSignal: signal });
|
|
68
|
+
},
|
|
69
|
+
}),
|
|
22
70
|
tool({
|
|
23
71
|
name: "specstream_find_list",
|
|
24
72
|
label: "Find a list",
|
|
25
73
|
description: [
|
|
26
74
|
"Find a list of real things on the live web and return every matching row, each with the page it was read from.",
|
|
27
|
-
"Use it when the answer is many things that meet conditions
|
|
75
|
+
"Use it when the answer is many things that meet conditions.",
|
|
28
76
|
"For one fact or a summary of one page, use a search tool instead.",
|
|
29
77
|
"It is priced per match. Rows that could not be confirmed are left out and not charged. The run starts only if the quoted maximum is within the user's price ceiling.",
|
|
30
78
|
"Returns JSON with state, list_id, list_link and rows (one object per match: its columns, source_url and checked_at).",
|
|
@@ -35,8 +83,7 @@ export default defineToolPlugin({
|
|
|
35
83
|
parameters: Type.Object({
|
|
36
84
|
request: Type.String({
|
|
37
85
|
minLength: 1,
|
|
38
|
-
description: "The list in plain words: what to find, where, what every row must meet, and the facts to bring back.
|
|
39
|
-
'Example: "Dental clinics in Lisbon with online booking, with their website and phone".',
|
|
86
|
+
description: "The list in plain words: what to find, where, what every row must meet, and the facts to bring back.",
|
|
40
87
|
}),
|
|
41
88
|
max_results: Type.Optional(Type.Integer({
|
|
42
89
|
minimum: 1,
|
|
@@ -79,3 +126,93 @@ export default defineToolPlugin({
|
|
|
79
126
|
}),
|
|
80
127
|
],
|
|
81
128
|
});
|
|
129
|
+
/** The plugin config a provider sees: the host passes the whole config, and the plugin entry holds ours. */
|
|
130
|
+
function providerConfig(host, fallback) {
|
|
131
|
+
const entries = host?.plugins?.entries;
|
|
132
|
+
return entries?.specstream?.config ?? fallback;
|
|
133
|
+
}
|
|
134
|
+
const credentialAccess = {
|
|
135
|
+
getCredentialValue: (config) => config?.apiKey,
|
|
136
|
+
setCredentialValue: (target, value) => {
|
|
137
|
+
target.apiKey = value;
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
const baseRegister = entry.register.bind(entry);
|
|
141
|
+
entry.register = (api) => {
|
|
142
|
+
baseRegister(api);
|
|
143
|
+
if (typeof api?.registerWebSearchProvider === "function") {
|
|
144
|
+
const search = {
|
|
145
|
+
id: "specstream",
|
|
146
|
+
label: "SpecStream Search",
|
|
147
|
+
hint: "The most accurate web search API in the world ($5 per 1,000 searches, source URL and read time on every value)",
|
|
148
|
+
onboardingScopes: ["text-inference"],
|
|
149
|
+
credentialLabel: "SpecStream API key",
|
|
150
|
+
envVars: ["SPECSTREAM_API_KEY"],
|
|
151
|
+
placeholder: "ss_live_...",
|
|
152
|
+
signupUrl: "https://specstream.ai/search-api?utm_source=openclaw",
|
|
153
|
+
docsUrl: "https://specstream.ai/docs/api?utm_source=openclaw",
|
|
154
|
+
autoDetectOrder: 55,
|
|
155
|
+
credentialPath: "plugins.entries.specstream.config.apiKey",
|
|
156
|
+
...credentialAccess,
|
|
157
|
+
createTool: (ctx) => ({
|
|
158
|
+
description: "Search the live web with the SpecStream Search API. Returns an answer with its source URL and read time, matching rows, ranked sources and optional page passages.",
|
|
159
|
+
parameters: {
|
|
160
|
+
type: "object",
|
|
161
|
+
properties: {
|
|
162
|
+
query: { type: "string", description: "Search query in everyday words." },
|
|
163
|
+
passages: { type: "boolean", description: "Include main text passages from the closest pages." },
|
|
164
|
+
},
|
|
165
|
+
required: ["query"],
|
|
166
|
+
additionalProperties: false,
|
|
167
|
+
},
|
|
168
|
+
execute: async (args, context) => {
|
|
169
|
+
context?.signal?.throwIfAborted();
|
|
170
|
+
const settings = resolveConfig(providerConfig(ctx?.config, api?.pluginConfig));
|
|
171
|
+
const client = new SpecStreamClient({ apiKey: settings.apiKey });
|
|
172
|
+
return client.webSearch(String(args?.query ?? ""), {
|
|
173
|
+
passages: args?.passages === true,
|
|
174
|
+
abortSignal: context?.signal,
|
|
175
|
+
});
|
|
176
|
+
},
|
|
177
|
+
}),
|
|
178
|
+
};
|
|
179
|
+
api.registerWebSearchProvider(search);
|
|
180
|
+
}
|
|
181
|
+
if (typeof api?.registerWebFetchProvider === "function") {
|
|
182
|
+
const fetchProvider = {
|
|
183
|
+
id: "specstream",
|
|
184
|
+
label: "SpecStream Extract",
|
|
185
|
+
hint: "Read the main text of web pages, PDFs, Word and Excel files live ($0.80 per 1,000 pages, empty pages free)",
|
|
186
|
+
credentialLabel: "SpecStream API key",
|
|
187
|
+
envVars: ["SPECSTREAM_API_KEY"],
|
|
188
|
+
placeholder: "ss_live_...",
|
|
189
|
+
signupUrl: "https://specstream.ai/extract-api?utm_source=openclaw",
|
|
190
|
+
docsUrl: "https://specstream.ai/docs/api?utm_source=openclaw",
|
|
191
|
+
credentialPath: "plugins.entries.specstream.config.apiKey",
|
|
192
|
+
...credentialAccess,
|
|
193
|
+
createTool: (ctx) => ({
|
|
194
|
+
description: "Extract the clean main text, title and published date of a URL using the SpecStream Extract API.",
|
|
195
|
+
parameters: {
|
|
196
|
+
type: "object",
|
|
197
|
+
properties: {
|
|
198
|
+
url: { type: "string", description: "HTTP or HTTPS URL to read live." },
|
|
199
|
+
extractMode: { type: "string", enum: ["markdown", "text"], description: 'Output format ("markdown" or "text").' },
|
|
200
|
+
},
|
|
201
|
+
required: ["url"],
|
|
202
|
+
additionalProperties: false,
|
|
203
|
+
},
|
|
204
|
+
execute: async (args, context) => {
|
|
205
|
+
context?.signal?.throwIfAborted();
|
|
206
|
+
const settings = resolveConfig(providerConfig(ctx?.config, api?.pluginConfig));
|
|
207
|
+
const client = new SpecStreamClient({ apiKey: settings.apiKey });
|
|
208
|
+
return client.extractPages([String(args?.url ?? "")], {
|
|
209
|
+
format: args?.extractMode === "text" ? "text" : "markdown",
|
|
210
|
+
abortSignal: context?.signal,
|
|
211
|
+
});
|
|
212
|
+
},
|
|
213
|
+
}),
|
|
214
|
+
};
|
|
215
|
+
api.registerWebFetchProvider(fetchProvider);
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
export default entry;
|
package/openclaw.plugin.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "specstream",
|
|
3
3
|
"name": "SpecStream",
|
|
4
|
-
"description": "
|
|
4
|
+
"description": "The live web data engine. One platform to build, search, extract, enrich, map, and monitor data across the entire web. Source URL and read time on every value.",
|
|
5
5
|
"categories": [
|
|
6
6
|
"data-analytics"
|
|
7
7
|
],
|
|
8
|
-
"version": "0.1
|
|
8
|
+
"version": "0.2.1",
|
|
9
9
|
"configSchema": {
|
|
10
10
|
"type": "object",
|
|
11
11
|
"properties": {
|
|
@@ -73,8 +73,16 @@
|
|
|
73
73
|
},
|
|
74
74
|
"contracts": {
|
|
75
75
|
"tools": [
|
|
76
|
+
"specstream_web_search",
|
|
77
|
+
"specstream_extract_pages",
|
|
76
78
|
"specstream_find_list",
|
|
77
79
|
"specstream_get_list_rows"
|
|
80
|
+
],
|
|
81
|
+
"webSearchProviders": [
|
|
82
|
+
"specstream"
|
|
83
|
+
],
|
|
84
|
+
"webFetchProviders": [
|
|
85
|
+
"specstream"
|
|
78
86
|
]
|
|
79
87
|
}
|
|
80
88
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@specstream/openclaw-plugin",
|
|
3
|
-
"version": "0.1
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.2.1",
|
|
4
|
+
"description": "The live web data engine. One platform to build, search, extract, enrich, map, and monitor data across the entire web.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
7
7
|
"dist",
|
|
@@ -15,7 +15,9 @@
|
|
|
15
15
|
"openclaw",
|
|
16
16
|
"openclaw-plugin",
|
|
17
17
|
"specstream",
|
|
18
|
-
"
|
|
18
|
+
"search-api",
|
|
19
|
+
"extract-api",
|
|
20
|
+
"web-search",
|
|
19
21
|
"web-data",
|
|
20
22
|
"live-web",
|
|
21
23
|
"agent-tools",
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: specstream-extract-pages
|
|
3
|
+
description: Read the main text of up to 20 web pages, PDFs, Word or Excel files live with the Extract API ($0.80 per 1,000 pages).
|
|
4
|
+
metadata: { "openclaw": { "requires": { "config": ["mcp.servers.specstream"] } } }
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Read pages and documents live
|
|
8
|
+
|
|
9
|
+
SpecStream is the live web data engine for teams and agents. Use the configured MCP server at `https://api.specstream.ai/mcp`.
|
|
10
|
+
|
|
11
|
+
Use `read_pages` with `{"urls": ["<url>", ...]}` (1 to 20 `http` or `https` URLs) to read the clean main text, title and published date of web pages, PDFs, Word documents or Excel spreadsheets. Each page that returns text costs $0.0008 ($0.80 per 1,000 pages) from the account balance, and a page with no text is not charged. No quote or approval is needed.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: specstream-web-search
|
|
3
|
+
description: Answer a question from the live web in seconds with the Search API ($5 per 1,000 searches, no quote needed).
|
|
4
|
+
metadata: { "openclaw": { "requires": { "config": ["mcp.servers.specstream"] } } }
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Search the live web
|
|
8
|
+
|
|
9
|
+
SpecStream is the live web data engine for teams and agents. Use the configured MCP server at `https://api.specstream.ai/mcp`.
|
|
10
|
+
|
|
11
|
+
Use `search_web` with `{"q": "<the question>"}` when the person needs one fact, a fast web search with sources, or a quick look at the first rows of a request before pricing a full Deep Search run. Set `"passages": true` when you want the main text passages of the closest pages included in the reply.
|
|
12
|
+
|
|
13
|
+
Each call costs $0.005 ($5 per 1,000 searches) from the account balance and needs no quote or approval. The reply returns `kind` (`fact` or `list`), `answer` (with `value`, `page` and `seen_at`), `rows` and ranked `sources`. When `kind` is `list`, `handoff` gives the estimated size and the `compile` call to price and run the full dataset.
|