skim-mcp 0.2.3 → 0.2.5

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.
Files changed (3) hide show
  1. package/README.md +29 -3
  2. package/dist/index.js +10 -10
  3. package/package.json +2 -2
package/README.md CHANGED
@@ -1,12 +1,18 @@
1
1
  # skim-mcp
2
2
 
3
- **Give your AI agent the ability to read any URL clean Markdown, ~4x smaller than raw HTML. No ads, no nav, no boilerplate.**
3
+ **Skim turns URLs into clean markdown for agents. Get a free card key at [https://skim402.com](https://skim402.com) (`sk402_`). Wallet/x402 is optional.**
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/skim-mcp.svg)](https://www.npmjs.com/package/skim-mcp)
6
6
  [![MCP Registry](https://img.shields.io/badge/MCP-Registry-blue)](https://registry.modelcontextprotocol.io/v0/servers?search=skim402)
7
7
  [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
8
8
 
9
- `skim-mcp` is the official Model Context Protocol server for [Skim](https://skim402.com) — the clean reader API for AI agents. It exposes `read_url`, `read_urls` (batch), `extract_url` (structured / table), `crawl_url`, `read_pdf`, `watch_urls`, `check_watch`, and `poll_signal`. The default path is a card-plan API key (`SKIM_API_KEY`); x402 wallet pay stays optional.
9
+ `skim-mcp` is the official Model Context Protocol server for [Skim](https://skim402.com). It turns any URL into clean, agent-ready Markdown (no ads, no nav, no boilerplate).
10
+
11
+ **Default path: a card-plan API key.** Get a free `sk402_` key at [skim402.com](https://skim402.com) ([pricing](https://skim402.com/pricing)). Paste it as `SKIM_API_KEY`. A crypto wallet is **not** required.
12
+
13
+ **Optional path: x402 wallet pay.** If you prefer pay-per-call in USDC on Base, you can set `SKIM_WALLET_PRIVATE_KEY` instead. Ignore this unless you want it.
14
+
15
+ **Tools in this package:** `read_url`, `read_urls`, `extract_url`, `crawl_url`, `read_pdf`, `watch_urls`, `check_watch`, `poll_signal`.
10
16
 
11
17
  > **See it before you wire it:** [try Skim free in your browser](https://freeskims.skim402.com) — 10 free skims a day, no signup. Paste a URL, see exactly what your agent gets back.
12
18
 
@@ -74,6 +80,19 @@ Fund a dedicated Base wallet with a small USDC balance ($1 ≈ 500 reads). Full
74
80
 
75
81
  ---
76
82
 
83
+ ## FAQ
84
+
85
+ **Do I need an API key?**
86
+ Yes for the default path. Get a free `sk402_` key at [https://skim402.com](https://skim402.com). A wallet is optional.
87
+
88
+ **Is this wallet-only? Do I need crypto?**
89
+ No. Card API key is the default. x402 wallet pay is optional.
90
+
91
+ **What tools can my agent call?**
92
+ `read_url`, `read_urls` (batch), `extract_url`, `crawl_url`, `read_pdf`, `watch_urls`, `check_watch`, and `poll_signal`.
93
+
94
+ ---
95
+
77
96
  ## Try it without an agent
78
97
 
79
98
  Test the endpoint directly. With a card key:
@@ -181,12 +200,19 @@ Card-lane `/api/t/watch*` is live (POST without a key returns `401`). Optional H
181
200
 
182
201
  Poll a [Skim Signal](https://skim402.com/signals) and return the latest structured items (title, summary, source, timestamp, link, and entities). **2 credits** per successful poll; failed polls are refunded.
183
202
 
184
- **Requires `SKIM_API_KEY`.** The card-lane routes are `GET /api/t/signal/{slug}/latest?limit=` and `GET /api/t/feeds/x402/latest?limit=` for the x402 ecosystem feed.
203
+ **Requires `SKIM_API_KEY`.** Wallet-only configs get a clear error: the live `GET /api/v2/...` wallet twin uses a v2 402 with an empty body, which the current `x402-fetch` wrapper does not handle.
185
204
 
186
205
  **Input:** `{ "slug": "ai-news", "limit": 20 }`
187
206
 
188
207
  Optional documented filters: `forms` (SEC filings and campaign finance), `categories` (deals), `fields` (research), `states` (film incentives), and `committees` (campaign finance).
189
208
 
209
+ **Routes (API key):** `GET /api/t/signal/{slug}/latest?limit=` · `GET /api/t/feeds/x402/latest?limit=` (x402 is not `/signal/x402`)
210
+
211
+ ```bash
212
+ curl -H 'Authorization: Bearer sk402_your_key_here' \
213
+ 'https://skim402.com/api/t/signal/ai-news/latest?limit=20'
214
+ ```
215
+
190
216
  ```
191
217
  Poll the ai-news Signal for the latest 20 items.
192
218
  ```
package/dist/index.js CHANGED
@@ -4,7 +4,7 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
4
4
  import { privateKeyToAccount } from "viem/accounts";
5
5
  import { wrapFetchWithPayment } from "x402-fetch";
6
6
  import { z } from "zod";
7
- const VERSION = "0.2.3";
7
+ const VERSION = "0.2.5";
8
8
  const BASE_URL = (process.env.SKIM_API_URL ?? "https://skim402.com").replace(/\/+$/, "");
9
9
  const API_KEY = process.env.SKIM_API_KEY ?? "";
10
10
  const PRIVATE_KEY = process.env.SKIM_WALLET_PRIVATE_KEY ?? "";
@@ -493,19 +493,19 @@ server.tool("check_watch", "Poll a Skim Watch for content changes (or fetch regi
493
493
  return fail(requestFailedMessage(err));
494
494
  }
495
495
  });
496
- server.tool("poll_signal", "Poll a Skim Signal feed and return the latest structured items. 2 credits per successful poll; failed polls are refunded. Requires SKIM_API_KEY because the wallet lane uses a v2 402 handshake that x402-fetch does not support for these GET feeds.", {
497
- slug: z.enum(SIGNAL_SLUGS).describe("Signal slug. Use x402 for the ecosystem feed."),
498
- limit: z.number().int().min(1).max(100).optional().describe("Max items, newest first. Default 50, capped at 100."),
499
- forms: z.string().optional().describe("Comma-separated form filter for sec-filings or campaign-finance."),
500
- categories: z.string().optional().describe("Comma-separated category filter for deals."),
501
- fields: z.string().optional().describe("Comma-separated arXiv field filter for research."),
502
- states: z.string().optional().describe("Comma-separated two-letter state filter for film-incentives."),
503
- committees: z.string().optional().describe("Comma-separated committee-name filter for campaign-finance."),
496
+ server.tool("poll_signal", "Poll a Skim Signal feed and return the latest structured items (title, summary, source, timestamp, link, entities). 2 credits per successful poll; failed polls are refunded. Card lane: GET /api/t/signal/{slug}/latest?limit= (filters: forms, categories, fields, states, committees). The x402 ecosystem feed is GET /api/t/feeds/x402/latest — never /signal/x402. Requires SKIM_API_KEY. No x402-fetch-compatible wallet twin (GET /api/v2/... returns a v2 402 with an empty body).", {
497
+ slug: z.enum(SIGNAL_SLUGS).describe("Signal slug from skim402.com/signals. Use x402 for the ecosystem feed, not /signal/x402."),
498
+ limit: z.number().int().min(1).max(100).optional().describe("Max items, newest-first. Default 50, capped at 100."),
499
+ forms: z.string().optional().describe("Comma-separated form filter. sec-filings: 8-K, S-1, 10-K, 10-Q, SC 13D, SC 13G, 4. campaign-finance: F1, F2, F3, F3P, F3X, F3L, F24, F5, F6, F9, F13, F99."),
500
+ categories: z.string().optional().describe("deals only. Comma-separated category terms (1–8, each 2–40 chars), e.g. laptop,gpu."),
501
+ fields: z.string().optional().describe("research only. Comma-separated arXiv fields: ai, ml, nlp, vision, robotics, agents, security, quantum."),
502
+ states: z.string().optional().describe("film-incentives only. Comma-separated two-letter states: CA, NY, GA, NM, TX."),
503
+ committees: z.string().optional().describe("campaign-finance only. Comma-separated committee-name substrings (1–8, each 2–60 chars), e.g. turning point,dnc."),
504
504
  }, async ({ slug, limit, forms, categories, fields, states, committees }) => {
505
505
  if (!hasAuth)
506
506
  return authMissing();
507
507
  if (!cardLane) {
508
- return fail("poll_signal is card-lane only. Set SKIM_API_KEY (sk402_..., free tier at skim402.com/pricing).");
508
+ return fail("poll_signal is card-lane only (GET /api/t/signal/{slug}/latest or GET /api/t/feeds/x402/latest) — set SKIM_API_KEY (sk402_..., free tier at skim402.com/pricing). The wallet twin returns a v2 402 with an empty body, which the existing x402-fetch wrapper does not handle.");
509
509
  }
510
510
  try {
511
511
  const query = {};
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "skim-mcp",
3
- "version": "0.2.3",
3
+ "version": "0.2.5",
4
4
  "mcpName": "io.github.JessieJanie/skim402",
5
- "description": "MCP server for Skim — clean web reader for AI agents. Card API key or x402 wallet. Batch, extract, crawl, PDF, watch, signals.",
5
+ "description": "MCP server for Skim — URLs to clean markdown. Card API key (sk402_) default; wallet/x402 optional. Batch, extract, crawl, PDF, watch, signals.",
6
6
  "type": "module",
7
7
  "bin": {
8
8
  "skim-mcp": "dist/index.js"