opedd-mcp 0.12.9 → 0.12.10

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 (2) hide show
  1. package/dist/index.js +14 -17
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -350,7 +350,7 @@ function buildTools(has) {
350
350
  // ─── Phase 12 Wave 3 W3.1 — onboarding helpers ────────────────────────────
351
351
  {
352
352
  name: "detect_platform",
353
- description: "Detect the content platform behind a URL via POST /detect-platform (Phase 12 Wave 3 W3.1). " +
353
+ description: "For publishers: detect the content platform behind a URL. " +
354
354
  "Public no-auth lookup. Given a URL, identifies what platform powers it " +
355
355
  "(Substack / Beehiiv / Ghost / Medium / Brevo / custom) and returns the suggested onboarding workflow. " +
356
356
  "Hostname-detectable platforms (Substack subdomain, Beehiiv suffix, etc.) resolve in milliseconds; " +
@@ -373,7 +373,7 @@ function buildTools(has) {
373
373
  // ─── Phase 12 Wave 1 W1.1 — public RSL Standard manifest ─────────────────
374
374
  {
375
375
  name: "rsl_get",
376
- description: "Fetch a publisher's RSL Standard manifest via GET /rsl-manifest (Phase 12 Wave 1 W1.1). " +
376
+ description: "Fetch a publisher's RSL Standard manifest (machine-readable licensing terms). " +
377
377
  "Public no-auth endpoint — discovery surface for AI agents/crawlers wanting to know what's licensable " +
378
378
  "from a publisher BEFORE going through the buyer-account signup flow. " +
379
379
  "Returns the 4 canonical license types (ai_retrieval, ai_training, human_per_article, human_full_archive) " +
@@ -382,8 +382,8 @@ function buildTools(has) {
382
382
  "CDSM Article 4(3) reservation state + `tdm:reservationSignedAt` timestamp — regulators can post-hoc " +
383
383
  "verify the reservation was the claimed value at the claimed time. Default `jsonld: false` returns " +
384
384
  "the raw RSL Standard JSON manifest. " +
385
- "Per INVARIANTS.md W1.6: this is the PUBLISHER-side CDSM Article 4(3) declaration surface. It is NOT " +
386
- "a signed compliance attestation (which is buyer-side, JWT-auth, via article_53_attestation tool).",
385
+ "This is the publisher's own declaration. It is not a compliance attestation for a buyer " +
386
+ "(use article_53_attestation for that).",
387
387
  inputSchema: {
388
388
  type: "object",
389
389
  required: ["publisher_id"],
@@ -482,7 +482,7 @@ function buildTools(has) {
482
482
  "retrieve articles: it answers 403 SEARCH_ONLY_LICENCE \u2014 ask a question with search_passages instead. " +
483
483
  "Articles the publisher stopped licensing answer 403 ARTICLE_EXCLUDED. " +
484
484
  "The publisher must have content delivery enabled and must have pushed content for the article. " +
485
- "Phase 11 M2 RAG-extended shape: response includes 7 RAG-essential metadata fields — author, language, word_count, content_hash, image_urls, canonical_url, tags. " +
485
+ "The response includes author, language, word_count, content_hash, image_urls, canonical_url and tags. " +
486
486
  "On pre-2026-05-14 historical articles, optional fields (author/language/image_urls/canonical_url/tags) may be NULL. " +
487
487
  "NULL means 'data unavailable for this article', NOT 'explicitly empty' — treat as data-missing when filtering; do not interpret as anti-match.",
488
488
  inputSchema: {
@@ -506,7 +506,7 @@ function buildTools(has) {
506
506
  if (has.accessKey || has.buyerToken) {
507
507
  TOOLS.push({
508
508
  name: "list_feed",
509
- description: "List articles from a buyer's licensed catalog via GET /enterprise-license (Phase 10 + 11). " +
509
+ description: "List the articles in a licence order you hold. " +
510
510
  "Content contract: AI training orders include full content_body for the back catalogue up to the order date " +
511
511
  "(content_access 'included'). Every other order is discovery-only (content_body null): AI answers monthly and " +
512
512
  "client display fetch text per article via get_content (content_access 'retrieval_per_article'); pay-per-request " +
@@ -542,11 +542,11 @@ function buildTools(has) {
542
542
  });
543
543
  TOOLS.push({
544
544
  name: "stream_feed_ndjson",
545
- description: "Bulk-export a buyer's licensed catalog via GET /enterprise-license?format=ndjson (Phase 11 M3). " +
545
+ description: "Bulk-export the articles in a licence order you hold. " +
546
546
  "Returns up to 1000 articles per call (collected from line-delimited JSON wire format). " +
547
547
  "Same content contract as list_feed: full text for AI training orders only; every other order exports " +
548
548
  "metadata (content_body null) — use get_content for article text. " +
549
- "Each article emits one usage_records row (analytics-only sentinel 'bulk-export:<request_id>:<article_id>' — not metered-billable per the revenue-model bifurcation invariant). " +
549
+ "Each exported article is recorded for analytics; a bulk export is not billed per article. " +
550
550
  "Use `since` (ISO 8601) for delta-feed. Use `cursor` to paginate beyond 1000. " +
551
551
  "Backend supports 5000 articles per call; the MCP cap is 1000 for transport reasonability. " +
552
552
  "Real bulk-ingest pipelines should use the Python SDK (pip install opedd) directly — not via MCP. " +
@@ -638,15 +638,12 @@ function buildTools(has) {
638
638
  });
639
639
  TOOLS.push({
640
640
  name: "article_53_attestation",
641
- description: "Issue a signed compliance attestation (a JWT) for a specific license via " +
642
- "GET /eu-ai-act/article-53-attestation (Phase 12 Wave 1 W1.4). " +
641
+ description: "Issue a signed compliance attestation (a JWT) for a licence you hold. " +
643
642
  "Returns a freshly-signed HS256 JWT regulators can verify offline against the canonical signing key. " +
644
643
  "Embeds: license context, usage-count over the attestation window, the most-recent Tempo Merkle root, " +
645
644
  "and canonical claims (iss/sub/iat/exp/jti/aud). " +
646
645
  "**The artifact a buyer hands to legal/procurement as evidence of where its content came from.** " +
647
- "Per INVARIANTS.md W1.6: this is the buyer-side attestation ONLY (how a licence was used). " +
648
- "It does NOT discharge a publisher's CDSM Article 4(3) reservation obligation — " +
649
- "that lives on the rsl_get tool (jsonld=true variant). Never conflate. " +
646
+ "It attests how your licence was used; the publisher's own licensing declaration is rsl_get. " +
650
647
  "Optional `content_id` scopes the attestation to one article; default is license-wide. " +
651
648
  "Window cap: 365 days. Auth: an audit-scoped buyer API key (OPEDD_BUYER_TOKEN) or OPEDD_BUYER_JWT.",
652
649
  inputSchema: {
@@ -1006,10 +1003,10 @@ export async function dispatchTool(name, args, creds = ENV_CREDS) {
1006
1003
  return err("query must be at most 1000 characters");
1007
1004
  const token = argToken || creds.buyerToken;
1008
1005
  if (!token) {
1009
- return err("A buyer API key with the 'search' scope is required (or set OPEDD_BUYER_TOKEN). " +
1010
- "Create one at opedd.com/buyer \u2192 Account \u2192 API keys \u2192 Create, ticking 'search'. " +
1011
- "You also need an active per-question licence for each publisher you want searched \u2014 " +
1012
- "use search_content to find them and place_licence_order to buy.");
1006
+ return err("This needs an Opedd buyer key. Sign up at https://opedd.com/buyer/signup (about two minutes): " +
1007
+ "new accounts start with up to 3 free answers, then each answer is billed at the publication's own price. " +
1008
+ "Then pass the key as Authorization: Bearer <key> (hosted server https://mcp.opedd.com/mcp) or " +
1009
+ "OPEDD_BUYER_TOKEN (local). To see what Opedd covers first, use search_content or publisher_directory (free, no key).");
1013
1010
  }
1014
1011
  const envelope = (await opeddFetch(creds, "/search", {
1015
1012
  method: "POST",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opedd-mcp",
3
- "version": "0.12.9",
3
+ "version": "0.12.10",
4
4
  "description": "Content licensing for the AI era. Licensed, rights-cleared content for AI agents, with a verifiable license key for every article. The MCP alternative to unlicensed scraping for RAG and AI search.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",