opedd-mcp 0.6.6 → 0.6.8

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 CHANGED
@@ -18,7 +18,7 @@
18
18
  <p align="center">
19
19
  <a href="cursor://anysphere.cursor-deeplink/mcp/install?name=opedd&config=eyJjb21tYW5kIjoibnB4IC15IG9wZWRkLW1jcCJ9"><img src="https://img.shields.io/badge/Add%20to-Cursor-000?logo=cursor" alt="Add to Cursor"></a>
20
20
  <a href="https://insiders.vscode.dev/redirect/mcp/install?name=opedd&config=%7B%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22opedd-mcp%22%5D%7D"><img src="https://img.shields.io/badge/Install%20in-VS%20Code-007ACC?logo=visualstudiocode" alt="Install in VS Code"></a>
21
- <a href="https://opedd.com/for-ai-agents"><img src="https://img.shields.io/badge/Docs-opedd.com-111" alt="Docs"></a>
21
+ <a href="https://opedd.com/for-ai-agents?utm_source=github&utm_medium=readme&utm_campaign=mcp"><img src="https://img.shields.io/badge/Docs-opedd.com-111" alt="Docs"></a>
22
22
  </p>
23
23
 
24
24
  Lets AI assistants (Claude Desktop, Cursor, Windsurf, or any MCP-compatible host) discover, purchase, and verify content licenses autonomously — mid-conversation, without opening a browser. Every license is registered on-chain (Tempo blockchain) with cryptographic proof.
@@ -31,7 +31,7 @@ Lets AI assistants (Claude Desktop, Cursor, Windsurf, or any MCP-compatible host
31
31
  npx opedd-mcp
32
32
  ```
33
33
 
34
- Then add it to your MCP host (see [Claude Desktop / Cursor / Windsurf setup](#claude-desktop-setup) below). Discovery + verification tools work with no configuration; purchasing and content retrieval use optional API keys from [opedd.com](https://opedd.com).
34
+ Then add it to your MCP host (see [Claude Desktop / Cursor / Windsurf setup](#claude-desktop-setup) below). Discovery + verification tools work with no configuration; purchasing and content retrieval use optional API keys from [opedd.com](https://opedd.com?utm_source=github&utm_medium=readme&utm_campaign=mcp).
35
35
 
36
36
  ## Hosted endpoint — no install (mcp.opedd.com)
37
37
 
@@ -279,9 +279,9 @@ Opedd is the **licensed content delivery layer** for AI — not just a licensing
279
279
 
280
280
  ## Learn more
281
281
 
282
- - [Opedd for AI Agents](https://opedd.com/for-ai-agents) — full documentation, code examples, endpoint reference
282
+ - [Opedd for AI Agents](https://opedd.com/for-ai-agents?utm_source=github&utm_medium=readme&utm_campaign=mcp) — full documentation, code examples, endpoint reference
283
283
  - [API Docs](https://docs.opedd.com) — OpenAPI spec with agent endpoints
284
- - [Opedd Registry](https://opedd.com/registry) — browse on-chain license proofs
284
+ - [Opedd Registry](https://opedd.com/registry?utm_source=github&utm_medium=readme&utm_campaign=mcp) — browse on-chain license proofs
285
285
 
286
286
  ## License
287
287
 
package/dist/index.js CHANGED
@@ -640,7 +640,10 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
640
640
  // dispatchTool) keeps unit tests, which call dispatchTool directly, silent.
641
641
  const start = Date.now();
642
642
  const result = await dispatchTool(request.params.name, (request.params.arguments ?? {}));
643
- captureToolCall(request.params.name, Date.now() - start, result.isError !== true);
643
+ // channel:"stdio" lets the channel report separate local (npx) usage from
644
+ // hosted-gateway usage (channel:"gateway"); the Phase-2 hosted trigger
645
+ // counts only the latter.
646
+ captureToolCall(request.params.name, Date.now() - start, result.isError !== true, { channel: "stdio" });
644
647
  return result;
645
648
  });
646
649
  // ─── Tool dispatcher (exported for unit tests) ────────────────────────────────
@@ -5,7 +5,7 @@ export declare function isTelemetryEnabled(): boolean;
5
5
  * PII, keys, or content by construction. Pure; exported so a test can assert
6
6
  * the privacy invariant directly.
7
7
  */
8
- export declare function toolCallProperties(tool: string, durationMs: number, ok: boolean): Record<string, string | number | boolean>;
8
+ export declare function toolCallProperties(tool: string, durationMs: number, ok: boolean, extra?: Record<string, string | number | boolean>): Record<string, string | number | boolean>;
9
9
  export declare function initTelemetry(): void;
10
- export declare function captureToolCall(tool: string, durationMs: number, ok: boolean): void;
10
+ export declare function captureToolCall(tool: string, durationMs: number, ok: boolean, extra?: Record<string, string | number | boolean>): void;
11
11
  export declare function shutdownTelemetry(): Promise<void>;
package/dist/telemetry.js CHANGED
@@ -36,8 +36,14 @@ export function isTelemetryEnabled() {
36
36
  * PII, keys, or content by construction. Pure; exported so a test can assert
37
37
  * the privacy invariant directly.
38
38
  */
39
- export function toolCallProperties(tool, durationMs, ok) {
39
+ export function toolCallProperties(tool, durationMs, ok, extra) {
40
+ // Spread `extra` FIRST so it can never overwrite the privacy-critical /
41
+ // integrity fields below. Otherwise a future caller passing e.g.
42
+ // { tool: ... } or { ok: ... } could silently forge metrics or shadow the
43
+ // canonical fields — the "nothing sensitive by construction" guarantee
44
+ // must hold even against a coding mistake in a caller.
40
45
  return {
46
+ ...extra,
41
47
  tool,
42
48
  duration_ms: Math.round(durationMs),
43
49
  ok,
@@ -63,14 +69,18 @@ export function initTelemetry() {
63
69
  client = null;
64
70
  }
65
71
  }
66
- export function captureToolCall(tool, durationMs, ok) {
72
+ export function captureToolCall(tool, durationMs, ok,
73
+ // Extra event properties (still no params/PII/keys by construction).
74
+ // The hosted gateway uses this to tag internal probes ({ internal: true })
75
+ // so channel metrics can be filtered to genuinely external callers.
76
+ extra) {
67
77
  if (!client)
68
78
  return;
69
79
  try {
70
80
  client.capture({
71
81
  distinctId: sessionId,
72
82
  event: "mcp_tool_call",
73
- properties: toolCallProperties(tool, durationMs, ok),
83
+ properties: toolCallProperties(tool, durationMs, ok, extra),
74
84
  });
75
85
  }
76
86
  catch {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "opedd-mcp",
3
- "version": "0.6.6",
4
- "description": "Licensed, rights-cleared content for AI agents — verifiable license keys, on-chain proof, and EU AI Act attestation. The MCP alternative to unlicensed scraping for RAG and AI search.",
3
+ "version": "0.6.8",
4
+ "description": "Licensed, rights-cleared content for AI agents \u2014 verifiable license keys, on-chain proof, and EU AI Act attestation. The MCP alternative to unlicensed scraping for RAG and AI search.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "mcpName": "com.opedd/opedd-mcp",
@@ -56,5 +56,8 @@
56
56
  "files": [
57
57
  "dist"
58
58
  ],
59
- "types": "dist/index.d.ts"
59
+ "types": "dist/index.d.ts",
60
+ "overrides": {
61
+ "esbuild": "^0.28.1"
62
+ }
60
63
  }