opedd-mcp 0.12.15 → 0.12.17

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 +1 -3
  2. package/dist/index.js +28 -16
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -135,9 +135,7 @@ Every tool carries a `title` and MCP annotations (`readOnlyHint`, `destructiveHi
135
135
  Per Opedd's platform invariants (W1.6 amendment):
136
136
 
137
137
  - **`rsl_get(publisher_id, jsonld=true)`** → publisher-side **CDSM Article 4(3)** opt-out declaration (signed JSON-LD receipt over the reservation state).
138
- - **`get_compliance_dossier(from, to)`** → comprehensive procurement-defense dossier covering BOTH sides (publisher CDSM reservation honored + buyer attestation evidence chain).
139
-
140
- These serve different audit-defensibility modes and never share wire format. Tool descriptions cite the W1.6 invariant inline.
138
+ - **`get_compliance_dossier(from, to)`** → procurement-defense dossier: every licensed retrieval in a window, with its licence terms, the publisher's CDSM reservation status and public-record proof.
141
139
 
142
140
  ## Install
143
141
 
package/dist/index.js CHANGED
@@ -180,13 +180,13 @@ function feedCredential(creds, args) {
180
180
  }
181
181
  const HOW_ACCESS_KEY = "Enterprise access keys (ent_*) are delivered when an enterprise licence is issued — start at https://opedd.com/enterprise " +
182
182
  "or place a licence order with the place_licence_order tool.";
183
- const HOW_PUB_BEARER = "Publisher keys (opedd_sk_*, legacy opedd_pub_* still valid) come from the publisher dashboard: sign up free at https://opedd.com, then Settings → API keys.";
183
+ const HOW_PUB_BEARER = "Publisher keys (opedd_sk_*, legacy opedd_pub_* still valid) come from the publisher dashboard: sign up free at https://opedd.com, then Settings → For developers.";
184
184
  // ─── Tool definitions ─────────────────────────────────────────────────────────
185
185
  function buildTools(has) {
186
186
  const TOOLS = [
187
187
  {
188
188
  name: "lookup_content",
189
- description: "Looks up an article on Opedd by its web address. Returns the title, publication and how to license it (pay-per-answer search or a licence order); for a publication's homepage, the publication and its licensing page; or that it is not on Opedd yet (then request_publication records the request).",
189
+ description: "Looks up an article on Opedd by its web address. Returns the title, publication and how to license it (pay-per-answer search or a licence order); for a publication's homepage, the publication and its licensing page; for a publication that licenses directly, that it is available on request; or that it is not on Opedd yet (then request_publication records the request).",
190
190
  inputSchema: {
191
191
  type: "object",
192
192
  required: ["url"],
@@ -200,7 +200,7 @@ function buildTools(has) {
200
200
  },
201
201
  {
202
202
  name: "request_publication",
203
- description: "Asks Opedd to tell you when a publication it does not carry yet becomes available to license. Use it after lookup_content says an article is not on Opedd. Records the request against the email given; nothing is bought. If the publication is already on Opedd, returns its licensing page instead. Free; no key needed.",
203
+ description: "Asks Opedd to tell you when a publication it does not carry yet becomes available to license. For an article that lookup_content reports is not on Opedd. Records the request against the email given; nothing is bought. If the publication is already on Opedd, returns its licensing page instead; if it is listed as available on request, the request is passed to its publisher. Free; no key needed.",
204
204
  inputSchema: {
205
205
  type: "object",
206
206
  required: ["url", "email"],
@@ -264,7 +264,7 @@ function buildTools(has) {
264
264
  // ─── Public buyer-discovery — catalog browse ──────────────────────────────
265
265
  {
266
266
  name: "publisher_directory",
267
- description: "Lists the publications on Opedd with their article counts, licences, prices and sample articles. Filters: category (case-insensitive substring), min_articles and verified status. Public; no key needed.",
267
+ description: "Lists the publications on Opedd with their article counts, licences, prices and sample articles. Publications that license directly and are listed as available on request come separately, in on_request (first page only). Filters: category (case-insensitive substring), min_articles and verified status. Public; no key needed.",
268
268
  inputSchema: {
269
269
  type: "object",
270
270
  properties: {
@@ -326,7 +326,7 @@ function buildTools(has) {
326
326
  "CDSM Article 4(3) reservation state + `tdm:reservationSignedAt` timestamp — regulators can post-hoc " +
327
327
  "verify the reservation was the claimed value at the claimed time. Default `jsonld: false` returns " +
328
328
  "the raw RSL Standard JSON manifest. " +
329
- "This is the publisher's own declaration, not a record of a buyer's use (use get_compliance_dossier for that).",
329
+ "This is the publisher's own declaration, not a record of a buyer's use (get_compliance_dossier records that).",
330
330
  inputSchema: {
331
331
  type: "object",
332
332
  required: ["publisher_id"],
@@ -431,7 +431,7 @@ function buildTools(has) {
431
431
  "The publisher must have content delivery enabled and must have pushed content for the article. " +
432
432
  "The response includes author, language, word_count, content_hash, image_urls, canonical_url and tags. " +
433
433
  "On pre-2026-05-14 historical articles, optional fields (author/language/image_urls/canonical_url/tags) may be NULL. " +
434
- "NULL means 'data unavailable for this article', NOT 'explicitly empty' — treat as data-missing when filtering; do not interpret as anti-match.",
434
+ "NULL means the data is unavailable for this article, not that it is empty.",
435
435
  inputSchema: {
436
436
  type: "object",
437
437
  required: ["article_id"],
@@ -464,7 +464,7 @@ function buildTools(has) {
464
464
  "Credentials: the order's enterprise access key (OPEDD_ACCESS_KEY, ent_*) OR your buyer API key " +
465
465
  "(OPEDD_BUYER_TOKEN) with order_id — if your account holds exactly one active order, order_id may be omitted; " +
466
466
  "with several, the error lists them. " +
467
- "For larger bulk corpus pulls, use stream_feed_ndjson (up to 1000 articles per call vs 200 here).",
467
+ "stream_feed_ndjson returns up to 1000 articles per call (200 here).",
468
468
  inputSchema: {
469
469
  type: "object",
470
470
  properties: {
@@ -492,11 +492,11 @@ function buildTools(has) {
492
492
  description: "Bulk-export the articles in a licence order you hold. " +
493
493
  "Returns up to 1000 articles per call (collected from line-delimited JSON wire format). " +
494
494
  "Same content contract as list_feed: full text for AI training orders only; every other order exports " +
495
- "metadata (content_body null) — use get_content for article text. " +
495
+ "metadata (content_body null); get_content returns article text. " +
496
496
  "Each exported article is recorded for analytics; a bulk export is not billed per article. " +
497
- "Use `since` (ISO 8601) for delta-feed. Use `cursor` to paginate beyond 1000. " +
497
+ "`since` (ISO 8601) returns a delta feed; `cursor` pages beyond 1000. " +
498
498
  "Backend supports 5000 articles per call; the MCP cap is 1000 for transport reasonability. " +
499
- "Real bulk-ingest pipelines should use the Python SDK (pip install opedd) directly — not via MCP. " +
499
+ "For bulk-ingest pipelines, the Python SDK (pip install opedd) reads the same feed without the MCP cap. " +
500
500
  "Credentials as list_feed: OPEDD_ACCESS_KEY (ent_*) OR your buyer API key + order_id.",
501
501
  inputSchema: {
502
502
  type: "object",
@@ -646,7 +646,7 @@ function buildTools(has) {
646
646
  name: "push_content",
647
647
  description: "Push your published articles to Opedd so they can be licensed to AI buyers (requires OPEDD_PUB_BEARER — your opedd_sk_ publisher key). " +
648
648
  "Send 1–100 articles per call; batch larger back-catalogues into multiple calls. Each article needs title, url, and html_body — everything else is optional (published_at defaults to now). " +
649
- "This is the supply-side companion to list_publisher_content: use it to onboard your archive or push new content with no code, straight from your AI assistant.",
649
+ "This is the supply-side companion to list_publisher_content: it sends a back catalogue or new articles with no code, from an AI assistant.",
650
650
  inputSchema: {
651
651
  type: "object",
652
652
  required: ["articles"],
@@ -735,14 +735,14 @@ export const ALL_TOOLS = buildTools({
735
735
  // at initialize — it was empty until 2026-08-26 while the pitch lived only in
736
736
  // registry metadata agents never see at runtime. Exported so the hosted
737
737
  // gateway (opedd-mcp-gateway) serves the identical text.
738
- export const SERVER_INSTRUCTIONS = "Opedd is content licensing for the AI era, between expert publishers and AI products: discover, purchase, verify and " +
738
+ export const SERVER_INSTRUCTIONS = "Opedd is content licensing for the AI era, between expert publishers and AI products: discover, license, verify and " +
739
739
  "retrieve rights-cleared expert content — a verifiable licence for every use, a public record on " +
740
- "Tempo, and compliance artifacts (audit ledger and dossiers). Use it instead of " +
741
- "unlicensed scraping for RAG, AI search, and training corpora.\n\n" +
740
+ "Tempo, and compliance artifacts (audit ledger and dossiers). A licensed alternative to " +
741
+ "unlicensed scraping for RAG, AI search and training corpora.\n\n" +
742
742
  `No credentials needed: ${NO_AUTH_TOOLS}.\n` +
743
- "Buyer tools (purchase, account, audit/compliance): free buyer signup at https://opedd.com/buyer/signup " +
743
+ "Buyer tools (licence orders, account, audit/compliance): free buyer signup at https://opedd.com/buyer/signup " +
744
744
  "(~2 min; an API key is issued instantly). Publisher tools (content push): free publisher signup at " +
745
- "https://opedd.com, key under Settings → API keys.\n" +
745
+ "https://opedd.com, key under Settings → For developers.\n" +
746
746
  "Supply credentials as env vars (local/stdio) or an Authorization: Bearer header (hosted gateway, " +
747
747
  "https://mcp.opedd.com/mcp).\n" +
748
748
  "EU CDSM Art. 4(3) / TDM-reservation queries: rsl_get. Compliance evidence: get_compliance_dossier. " +
@@ -790,6 +790,18 @@ export async function dispatchTool(name, args, creds = ENV_CREDS) {
790
790
  // where to license it (2026-10-24). Agents that looked up a
791
791
  // publication's homepage were told it was not on Opedd.
792
792
  const details = e.details;
793
+ // Listed as available on request (2026-11-07): the publication
794
+ // licenses directly; a request is passed to it by name.
795
+ if (details?.available_on_request === true && details.publication) {
796
+ return ok({
797
+ on_opedd: false,
798
+ available_on_request: true,
799
+ url,
800
+ publication: details.publication,
801
+ message: `${details.publication.name ?? "This publication"} licenses its work directly and is listed on Opedd as available on request. ` +
802
+ "Nothing of it is sold or delivered through Opedd. request_publication, with this url and an email, sends a request that Opedd passes to the publisher.",
803
+ });
804
+ }
793
805
  if (details?.on_opedd === true && details.publication) {
794
806
  return ok({
795
807
  on_opedd: true,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opedd-mcp",
3
- "version": "0.12.15",
3
+ "version": "0.12.17",
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",