@ironflowsh/mcp 0.11.2 → 0.13.0

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/build/usage.d.ts CHANGED
@@ -4,12 +4,19 @@ export declare function callerHash(ip: string | undefined, salt: string): string
4
4
  export declare function summarizeArgs(body: unknown): string;
5
5
  export declare function toolLogFields(outcomes: {
6
6
  isError: boolean;
7
+ error?: string;
7
8
  }[], upstream: {
8
9
  status: number;
9
10
  code?: string;
10
11
  }[]): {
11
12
  isError?: boolean;
13
+ error?: string;
12
14
  upstream?: number[];
13
15
  upstream_error?: string;
14
16
  };
17
+ export declare class ClientMemory {
18
+ private readonly names;
19
+ remember(caller: string, client: string, now?: number): void;
20
+ recall(caller: string, now?: number): string;
21
+ }
15
22
  //# sourceMappingURL=usage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"AAkBA,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAInE;AAID,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAQ1D;AAKD,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAGvE;AAID,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAOnD;AAOD,wBAAgB,aAAa,CAC3B,QAAQ,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,EAAE,EAChC,QAAQ,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAC5C;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,CAQrE"}
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"AAqBA,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAInE;AAID,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAQ1D;AAKD,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAGvE;AAID,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAOnD;AAQD,wBAAgB,aAAa,CAC3B,QAAQ,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,EAChD,QAAQ,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAC5C;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,CAUrF;AAOD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqD;IAE3E,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,IAAI;IAUhE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,MAAM;CASjD"}
package/build/usage.js CHANGED
@@ -5,6 +5,9 @@ import { createHmac } from "node:crypto";
5
5
  const MAX_CLIENT_APP_LEN = 64;
6
6
  const MAX_ARGS_LEN = 600;
7
7
  const CALLER_HASH_LEN = 16;
8
+ const MAX_ERROR_LEN = 160;
9
+ const CLIENT_MEMORY_MS = 60 * 60 * 1000;
10
+ const MAX_REMEMBERED_CLIENTS = 10_000;
8
11
  const CLIENT_APP_PATTERN = /^[A-Za-z0-9 ._/@()+:-]*$/;
9
12
  const messages = (body) => (Array.isArray(body) ? body : [body]);
10
13
  // sanitizeClientApp returns a plain, printable app name of at most 64
@@ -50,17 +53,49 @@ export function summarizeArgs(body) {
50
53
  }
51
54
  // toolLogFields adds how a request's tool calls ended to its access-log
52
55
  // line: isError when any tool result went back as an error (the HTTP status
53
- // stays 200 for those), upstream with the API status of each request the
54
- // tools made, and upstream_error with the API's error codes. Empty for
55
- // requests without tool calls.
56
+ // stays 200 for those), error with the first error's text (so a failure
57
+ // that never reached the API still says why), upstream with the API status
58
+ // of each request the tools made, and upstream_error with the API's error
59
+ // codes. Empty for requests without tool calls.
56
60
  export function toolLogFields(outcomes, upstream) {
57
61
  if (outcomes.length === 0 && upstream.length === 0)
58
62
  return {};
59
63
  const codes = [...new Set(upstream.map((u) => u.code).filter(Boolean))];
64
+ const firstError = outcomes.find((o) => o.isError && o.error)?.error;
60
65
  return {
61
66
  isError: outcomes.length > 0 ? outcomes.some((o) => o.isError) : undefined,
67
+ error: firstError ? firstError.replace(/\s+/g, " ").slice(0, MAX_ERROR_LEN) : undefined,
62
68
  upstream: upstream.length > 0 ? upstream.map((u) => u.status) : undefined,
63
69
  upstream_error: codes.length > 0 ? codes.join(",") : undefined,
64
70
  };
65
71
  }
72
+ // The hosted server is stateless, so a tools/call arrives without the
73
+ // clientInfo its client sent at initialize. ClientMemory keeps the app name
74
+ // per caller hash for an hour, so later requests from the same caller can be
75
+ // attributed to it in the log and in X-Ironflow-Client. Several apps behind
76
+ // one IP share a hash; the log marks such names as recalled.
77
+ export class ClientMemory {
78
+ names = new Map();
79
+ remember(caller, client, now = Date.now()) {
80
+ if (!caller || !client)
81
+ return;
82
+ this.names.delete(caller);
83
+ this.names.set(caller, { client, at: now });
84
+ if (this.names.size > MAX_REMEMBERED_CLIENTS) {
85
+ const oldest = this.names.keys().next().value;
86
+ if (oldest !== undefined)
87
+ this.names.delete(oldest);
88
+ }
89
+ }
90
+ recall(caller, now = Date.now()) {
91
+ const hit = caller ? this.names.get(caller) : undefined;
92
+ if (!hit)
93
+ return "";
94
+ if (now - hit.at > CLIENT_MEMORY_MS) {
95
+ this.names.delete(caller);
96
+ return "";
97
+ }
98
+ return hit.client;
99
+ }
100
+ }
66
101
  //# sourceMappingURL=usage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"usage.js","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,4EAA4E;AAC5E,yBAAyB;AAEzB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAC9B,MAAM,YAAY,GAAG,GAAG,CAAC;AACzB,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,MAAM,kBAAkB,GAAG,0BAA0B,CAAC;AAItD,MAAM,QAAQ,GAAG,CAAC,IAAa,EAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAiB,CAAC;AAExG,sEAAsE;AACtE,0EAA0E;AAC1E,iDAAiD;AACjD,MAAM,UAAU,iBAAiB,CAAC,KAAyB;IACzD,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3C,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;AACxC,CAAC;AAED,2EAA2E;AAC3E,uDAAuD;AACvD,MAAM,UAAU,oBAAoB,CAAC,IAAa;IAChD,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC,CAAC,MAAM,KAAK,YAAY;YAAE,SAAS;QACxC,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE,IAAI;YAAE,OAAO,EAAE,CAAC;QAC3B,OAAO,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,sEAAsE;AACtE,6EAA6E;AAC7E,uDAAuD;AACvD,MAAM,UAAU,UAAU,CAAC,EAAsB,EAAE,IAAY;IAC7D,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IACnB,OAAO,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;AACvF,CAAC;AAED,0EAA0E;AAC1E,2EAA2E;AAC3E,MAAM,UAAU,aAAa,CAAC,IAAa;IACzC,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC,CAAC,MAAM,KAAK,YAAY,IAAI,CAAC,CAAC,MAAM,EAAE,SAAS,KAAK,SAAS;YAAE,SAAS;QAC7E,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAChD,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,wEAAwE;AACxE,4EAA4E;AAC5E,yEAAyE;AACzE,uEAAuE;AACvE,+BAA+B;AAC/B,MAAM,UAAU,aAAa,CAC3B,QAAgC,EAChC,QAA6C;IAE7C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9D,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACxE,OAAO;QACL,OAAO,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;QAC1E,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;QACzE,cAAc,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;KAC/D,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ironflowsh/mcp",
3
- "version": "0.11.2",
3
+ "version": "0.13.0",
4
4
  "mcpName": "io.github.ironflowsh/hyperliquid",
5
5
  "description": "Read-only Hyperliquid market data and wallet analytics MCP server for Claude, Cursor and AI agents",
6
6
  "author": "Ironflow <hello@ironflow.sh>",