skim-mcp 0.2.3 → 0.2.4

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 +8 -1
  2. package/dist/index.js +10 -10
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -181,12 +181,19 @@ Card-lane `/api/t/watch*` is live (POST without a key returns `401`). Optional H
181
181
 
182
182
  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
183
 
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.
184
+ **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
185
 
186
186
  **Input:** `{ "slug": "ai-news", "limit": 20 }`
187
187
 
188
188
  Optional documented filters: `forms` (SEC filings and campaign finance), `categories` (deals), `fields` (research), `states` (film incentives), and `committees` (campaign finance).
189
189
 
190
+ **Routes (API key):** `GET /api/t/signal/{slug}/latest?limit=` · `GET /api/t/feeds/x402/latest?limit=` (x402 is not `/signal/x402`)
191
+
192
+ ```bash
193
+ curl -H 'Authorization: Bearer sk402_your_key_here' \
194
+ 'https://skim402.com/api/t/signal/ai-news/latest?limit=20'
195
+ ```
196
+
190
197
  ```
191
198
  Poll the ai-news Signal for the latest 20 items.
192
199
  ```
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.4";
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,6 +1,6 @@
1
1
  {
2
2
  "name": "skim-mcp",
3
- "version": "0.2.3",
3
+ "version": "0.2.4",
4
4
  "mcpName": "io.github.JessieJanie/skim402",
5
5
  "description": "MCP server for Skim — clean web reader for AI agents. Card API key or x402 wallet. Batch, extract, crawl, PDF, watch, signals.",
6
6
  "type": "module",