tomoshi 1.0.0

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 ADDED
@@ -0,0 +1,28 @@
1
+ # tomoshi (灯 — lamp light)
2
+
3
+ Self-hosted web search & scraping MCP for AI agents. One binary, $5/mo.
4
+
5
+ - **npm:** `tomoshi` (primary) + `tomoshibi` alias
6
+ - **MCP:** 3 tools — `cinder_extract`, `cinder_discover`, `cinder_monitor`
7
+
8
+ ## Install
9
+
10
+ ```json
11
+ {
12
+ "mcpServers": {
13
+ "tomoshi": {
14
+ "command": "npx",
15
+ "args": ["-y", "tomoshi"],
16
+ "env": {
17
+ "TOMOSHIBI_API_URL": "http://localhost:7431"
18
+ }
19
+ }
20
+ }
21
+ }
22
+ ```
23
+
24
+ Legacy `CINDER_API_URL` still works.
25
+
26
+ ## Provenance
27
+
28
+ Published with npm Provenance (OIDC). Verify at https://www.npmjs.com/package/tomoshi
@@ -0,0 +1,8 @@
1
+ /**
2
+ * OAuth 2.1 SimpleProvider configuration.
3
+ * Uses in-memory stores — swap for persistent stores in production.
4
+ *
5
+ * @see https://tmcp.io/docs/auth/oauth
6
+ */
7
+ export declare const oauth: import("@tmcp/auth").OAuth<"built">;
8
+ //# sourceMappingURL=auth-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-provider.d.ts","sourceRoot":"","sources":["../src/auth-provider.ts"],"names":[],"mappings":"AAwBA;;;;;GAKG;AACH,eAAO,MAAM,KAAK,qCA8DhB,CAAC"}
@@ -0,0 +1,89 @@
1
+ import { SimpleProvider } from "@tmcp/auth";
2
+ /**
3
+ * In-memory storage for OAuth 2.1 client registrations, codes, and tokens.
4
+ * For production, replace with a database-backed store (Redis, Postgres, etc.).
5
+ */
6
+ const codes = new Map();
7
+ const clients = new Map();
8
+ const tokens = new Map();
9
+ const refreshTokens = new Map();
10
+ const chars = "abcdefghijkmnpqrstuvwxyz23456789";
11
+ function randomString(length = 32) {
12
+ const randomBytes = new Uint8Array(length);
13
+ crypto.getRandomValues(randomBytes);
14
+ let result = "";
15
+ for (let i = 0; i < randomBytes.byteLength; i++) {
16
+ result += chars[randomBytes[i] >> 3];
17
+ }
18
+ return result;
19
+ }
20
+ /**
21
+ * OAuth 2.1 SimpleProvider configuration.
22
+ * Uses in-memory stores — swap for persistent stores in production.
23
+ *
24
+ * @see https://tmcp.io/docs/auth/oauth
25
+ */
26
+ export const oauth = new SimpleProvider({
27
+ clients: {
28
+ async get(client_id) {
29
+ return clients.get(client_id);
30
+ },
31
+ async register(client_info) {
32
+ const client_id = randomString(13);
33
+ const newClient = {
34
+ ...client_info,
35
+ client_id,
36
+ client_id_issued_at: Date.now(),
37
+ redirect_uris: client_info.redirect_uris ?? [],
38
+ };
39
+ clients.set(client_id, newClient);
40
+ return newClient;
41
+ },
42
+ },
43
+ codes: {
44
+ async get(code) {
45
+ return codes.get(code);
46
+ },
47
+ async store(code, codeData) {
48
+ codes.set(code, codeData);
49
+ },
50
+ async delete(code) {
51
+ codes.delete(code);
52
+ },
53
+ },
54
+ tokens: {
55
+ async get(token) {
56
+ return tokens.get(token);
57
+ },
58
+ async store(token, tokenData) {
59
+ tokens.set(token, tokenData);
60
+ },
61
+ async delete(token) {
62
+ tokens.delete(token);
63
+ },
64
+ },
65
+ refreshTokens: {
66
+ async get(token) {
67
+ return refreshTokens.get(token);
68
+ },
69
+ async store(token, tokenData) {
70
+ refreshTokens.set(token, tokenData);
71
+ },
72
+ async delete(token) {
73
+ refreshTokens.delete(token);
74
+ },
75
+ },
76
+ }).build("http://localhost:9631", {
77
+ bearer: {
78
+ paths: {
79
+ POST: ["/mcp"],
80
+ GET: ["/sse"],
81
+ },
82
+ },
83
+ cors: {
84
+ origin: "*",
85
+ credentials: true,
86
+ },
87
+ registration: true,
88
+ });
89
+ //# sourceMappingURL=auth-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-provider.js","sourceRoot":"","sources":["../src/auth-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,348 @@
1
+ export interface ScreenshotOpts {
2
+ width?: number;
3
+ height?: number;
4
+ full_page?: boolean;
5
+ format?: "jpeg" | "png";
6
+ quality?: number;
7
+ wait_selector?: string;
8
+ }
9
+ export interface ImageProcessOpts {
10
+ format?: "jpeg" | "png";
11
+ max_width?: number;
12
+ quality?: number;
13
+ }
14
+ export type ScrapeActionType = "wait_ms" | "wait_selector" | "click" | "scroll_down" | "scroll_to_bottom";
15
+ export interface ScrapeAction {
16
+ type: ScrapeActionType;
17
+ ms?: number;
18
+ selector?: string;
19
+ }
20
+ export interface ExtractField {
21
+ selector: string;
22
+ attr?: string;
23
+ multiple?: boolean;
24
+ }
25
+ export interface ImageData {
26
+ url?: string;
27
+ blob?: string;
28
+ format?: string;
29
+ alt?: string;
30
+ title?: string;
31
+ source?: string;
32
+ width?: number;
33
+ height?: number;
34
+ size_bytes?: number;
35
+ }
36
+ export interface ScreenshotData {
37
+ blob?: string;
38
+ url?: string;
39
+ format?: string;
40
+ full_page?: boolean;
41
+ width?: number;
42
+ height?: number;
43
+ size_bytes?: number;
44
+ captured_at?: string;
45
+ }
46
+ export interface ScrapeParams {
47
+ url: string;
48
+ mode?: "smart" | "static" | "dynamic";
49
+ screenshot?: boolean;
50
+ screenshot_opts?: ScreenshotOpts;
51
+ images?: boolean;
52
+ image_format?: "url" | "blob";
53
+ max_images?: number;
54
+ max_image_size_kb?: number;
55
+ image_process?: ImageProcessOpts;
56
+ actions?: ScrapeAction[];
57
+ extract_schema?: Record<string, ExtractField>;
58
+ summary?: boolean;
59
+ summary_sentences?: number;
60
+ redact_pii?: boolean;
61
+ block_ads?: boolean;
62
+ remove_base64_images?: boolean;
63
+ include_links?: boolean;
64
+ /** @deprecated Use `mode: "dynamic"` instead. */
65
+ render?: boolean;
66
+ }
67
+ export interface ScrapeResult {
68
+ url: string;
69
+ markdown: string;
70
+ html?: string;
71
+ metadata: Record<string, string>;
72
+ images?: ImageData[];
73
+ screenshot?: ScreenshotData;
74
+ summary?: string;
75
+ extracted?: Record<string, unknown>;
76
+ links?: LinkData[];
77
+ }
78
+ export interface MultiScrapeParams {
79
+ urls: string[];
80
+ mode?: "smart" | "static" | "dynamic";
81
+ screenshot?: boolean;
82
+ screenshot_opts?: ScreenshotOpts;
83
+ images?: boolean;
84
+ image_format?: "url" | "blob";
85
+ max_images?: number;
86
+ max_image_size_kb?: number;
87
+ image_process?: ImageProcessOpts;
88
+ actions?: ScrapeAction[];
89
+ extract_schema?: Record<string, ExtractField>;
90
+ summary?: boolean;
91
+ summary_sentences?: number;
92
+ redact_pii?: boolean;
93
+ block_ads?: boolean;
94
+ remove_base64_images?: boolean;
95
+ include_links?: boolean;
96
+ /** @deprecated Use `mode: "dynamic"` instead. */
97
+ render?: boolean;
98
+ }
99
+ export interface MultiScrapeItem {
100
+ url: string;
101
+ title?: string;
102
+ word_count?: number;
103
+ markdown?: string;
104
+ html?: string;
105
+ metadata?: Record<string, string>;
106
+ screenshot?: ScreenshotData;
107
+ images?: ImageData[];
108
+ links?: LinkData[];
109
+ extracted?: Record<string, unknown>;
110
+ summary?: string;
111
+ error?: string;
112
+ }
113
+ export interface MultiScrapeResponse {
114
+ results: MultiScrapeItem[];
115
+ }
116
+ export interface CrawlParams {
117
+ url: string;
118
+ mode?: "smart" | "static" | "dynamic";
119
+ render?: boolean;
120
+ screenshot?: boolean;
121
+ images?: boolean;
122
+ image_format?: "url" | "blob";
123
+ maxDepth?: number;
124
+ limit?: number;
125
+ include_paths?: string[];
126
+ exclude_paths?: string[];
127
+ webhook_url?: string;
128
+ webhook_secret?: string;
129
+ }
130
+ export interface CrawlResponse {
131
+ id: string;
132
+ url: string;
133
+ render: boolean;
134
+ screenshot: boolean;
135
+ images: boolean;
136
+ maxDepth: number;
137
+ limit: number;
138
+ image_format?: string;
139
+ }
140
+ export interface CrawlPageResult {
141
+ url: string;
142
+ /** May be absent — the backend omits it when the page has no H1 heading. */
143
+ title?: string;
144
+ preview?: string;
145
+ }
146
+ export interface CrawlResultData {
147
+ status: "completed" | "partial" | "failed" | "cancelled";
148
+ total_pages: number;
149
+ max_depth: number;
150
+ limit: number;
151
+ pages: CrawlPageResult[];
152
+ failed_urls?: {
153
+ url: string;
154
+ error: string;
155
+ }[];
156
+ }
157
+ export interface CrawlStatusResponse {
158
+ id: string;
159
+ queue?: string;
160
+ state: "pending" | "active" | "completed" | "failed" | "retry" | "cancelled";
161
+ crawl?: CrawlResultData;
162
+ failed_urls?: {
163
+ url: string;
164
+ error: string;
165
+ }[];
166
+ }
167
+ export interface SearchParams {
168
+ query: string;
169
+ offset?: number;
170
+ limit?: number;
171
+ mode?: "fast";
172
+ includeDomains?: string[];
173
+ excludeDomains?: string[];
174
+ requiredText?: string[];
175
+ maxAge?: 1 | 7 | 30;
176
+ category?: "general" | "news" | "code";
177
+ rerank?: boolean;
178
+ }
179
+ export interface SearchResult {
180
+ title: string;
181
+ url: string;
182
+ description: string;
183
+ domain?: string;
184
+ id?: string;
185
+ relevance?: number;
186
+ highlights?: string[];
187
+ }
188
+ export interface SearchResponse {
189
+ query: string;
190
+ results: SearchResult[];
191
+ hasMore: boolean;
192
+ nextOffset: number;
193
+ count: number;
194
+ }
195
+ export interface LinkData {
196
+ url: string;
197
+ text?: string;
198
+ isInternal: boolean;
199
+ }
200
+ export interface MapParams {
201
+ url: string;
202
+ search?: string;
203
+ limit?: number;
204
+ }
205
+ export interface MapLink {
206
+ url: string;
207
+ source: string;
208
+ }
209
+ export interface MapResponse {
210
+ url: string;
211
+ count: number;
212
+ links: MapLink[];
213
+ }
214
+ export interface BatchParams {
215
+ urls: string[];
216
+ }
217
+ export interface BatchTask {
218
+ id: string;
219
+ url: string;
220
+ }
221
+ export interface BatchResponse {
222
+ batch_id: string;
223
+ tasks: BatchTask[];
224
+ }
225
+ export interface BatchStatusResponse {
226
+ batch_id: string;
227
+ total: number;
228
+ completed: number;
229
+ failed: number;
230
+ tasks: BatchTask[];
231
+ }
232
+ export interface MonitorParams {
233
+ url: string;
234
+ interval_seconds?: number;
235
+ webhook_url?: string;
236
+ webhook_secret?: string;
237
+ }
238
+ export interface MonitorResponse {
239
+ id: string;
240
+ url: string;
241
+ interval_seconds: number;
242
+ next_check: string;
243
+ }
244
+ export interface MonitorStatusResponse {
245
+ id: string;
246
+ url: string;
247
+ interval_seconds: number;
248
+ next_check: string;
249
+ last_hash?: string;
250
+ }
251
+ /**
252
+ * Timeout configuration per endpoint type (milliseconds).
253
+ *
254
+ * These are deliberately generous: the Cinder backend runs on Fly.io with
255
+ * scale-to-zero, so a request may first trigger a ~10-15s cold start before
256
+ * the actual work begins. Tight timeouts turn cold starts into hard failures.
257
+ */
258
+ export declare const CINDER_TIMEOUT: {
259
+ readonly scrape: 60000;
260
+ readonly crawl: 30000;
261
+ readonly crawlStatus: 15000;
262
+ readonly search: 30000;
263
+ readonly monitor: 30000;
264
+ readonly monitorStatus: 15000;
265
+ readonly monitorDelete: 15000;
266
+ readonly map: 30000;
267
+ readonly batch: 30000;
268
+ readonly batchStatus: 15000;
269
+ readonly links: 60000;
270
+ };
271
+ /**
272
+ * HTTP client for the Cinder API.
273
+ * Wraps all Cinder endpoints with type-safe methods, error handling, and SSRF prevention.
274
+ */
275
+ export declare class CinderClient {
276
+ private baseUrl;
277
+ private apiKey;
278
+ constructor();
279
+ private get headers();
280
+ private request;
281
+ /**
282
+ * Scrape a single webpage.
283
+ * POST /v1/scrape
284
+ */
285
+ scrape(params: ScrapeParams): Promise<ScrapeResult>;
286
+ /**
287
+ * Scrape multiple URLs synchronously (no Redis).
288
+ * POST /v1/scrape with { urls: [...] } — mirrors web_fetch_exa and
289
+ * Firecrawl POST /v2/batch/scrape sync. Max 10 URLs, errgroup limit 5.
290
+ */
291
+ scrapeMulti(params: MultiScrapeParams): Promise<MultiScrapeResponse>;
292
+ /**
293
+ * Enqueue an asynchronous crawl job.
294
+ * POST /v1/crawl
295
+ */
296
+ crawl(params: CrawlParams): Promise<CrawlResponse>;
297
+ /**
298
+ * Get crawl job status.
299
+ * GET /v1/crawl/:id
300
+ */
301
+ getCrawlStatus(id: string): Promise<CrawlStatusResponse>;
302
+ /**
303
+ * Search the web via SearXNG (primary) or Brave Search (fallback).
304
+ * POST /v1/search
305
+ */
306
+ search(params: SearchParams): Promise<SearchResponse>;
307
+ /**
308
+ * Discover URLs on a site via sitemap/link traversal.
309
+ * POST /v1/map
310
+ */
311
+ map(params: MapParams): Promise<MapResponse>;
312
+ /**
313
+ * Enqueue a batch scrape job (requires Redis).
314
+ * POST /v1/batch/scrape
315
+ */
316
+ batchScrape(params: BatchParams): Promise<BatchResponse>;
317
+ /**
318
+ * Get batch scrape status (requires Redis).
319
+ * GET /v1/batch/:id
320
+ */
321
+ getBatchStatus(batchId: string): Promise<BatchStatusResponse>;
322
+ /**
323
+ * Extract links from a page (via scrape with include_links).
324
+ * Reuses POST /v1/scrape — same SSRF/timeouts as scrape.
325
+ */
326
+ links(url: string): Promise<ScrapeResult>;
327
+ /**
328
+ * Create a change-tracking monitor (requires Redis).
329
+ * POST /v1/monitor
330
+ */
331
+ createMonitor(params: MonitorParams): Promise<MonitorResponse>;
332
+ /**
333
+ * Get monitor status (config + last hash + next check).
334
+ * GET /v1/monitor/:id
335
+ */
336
+ getMonitor(id: string): Promise<MonitorStatusResponse>;
337
+ /**
338
+ * Stop monitoring and remove the monitor record.
339
+ * DELETE /v1/monitor/:id
340
+ */
341
+ deleteMonitor(id: string): Promise<void>;
342
+ }
343
+ export declare class CinderError extends Error {
344
+ readonly statusCode: number;
345
+ readonly body: string;
346
+ constructor(message: string, statusCode: number, body: string);
347
+ }
348
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}