@nqminds/mcp-client 1.0.33 → 1.0.35

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.
@@ -1 +1 @@
1
- {"version":3,"file":"MCPChat.d.ts","sourceRoot":"","sources":["../src/MCPChat.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAIxE,OAAO,KAAK,EAAyB,YAAY,EAAe,MAAM,SAAS,CAAC;AA0ahF,wBAAgB,OAAO,CAAC,EACtB,aAAa,EACb,WAA6B,EAC7B,YAAiB,EACjB,SAAc,GACf,EAAE,YAAY,qBAyhBd"}
1
+ {"version":3,"file":"MCPChat.d.ts","sourceRoot":"","sources":["../src/MCPChat.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAIxE,OAAO,KAAK,EAAyB,YAAY,EAAe,MAAM,SAAS,CAAC;AA+bhF,wBAAgB,OAAO,CAAC,EACtB,aAAa,EACb,WAA6B,EAC7B,YAAiB,EACjB,SAAc,GACf,EAAE,YAAY,qBAyhBd"}
package/dist/MCPChat.js CHANGED
@@ -16,13 +16,23 @@ function stripUtmSource(url) {
16
16
  *
17
17
  * Expected JSON shape:
18
18
  * { "columns": ["Col A", "Col B"], "rows": [["val1", "val2"], ...] }
19
+ *
20
+ * On mobile the table switches to a card layout using data-label attributes.
21
+ * Rows beyond INITIAL_ROWS are hidden behind an expand button.
19
22
  */
23
+ const INITIAL_ROWS = 5;
20
24
  function JsonDataTable({ columns, rows }) {
25
+ const [showAll, setShowAll] = useState(false);
26
+ const visibleRows = showAll ? rows : rows.slice(0, INITIAL_ROWS);
27
+ const hiddenCount = rows.length - INITIAL_ROWS;
21
28
  return (React.createElement("div", { className: "mcp-data-table-wrapper" },
22
29
  React.createElement("table", { className: "mcp-data-table" },
23
30
  React.createElement("thead", null,
24
31
  React.createElement("tr", null, columns.map((col, i) => React.createElement("th", { key: i }, col)))),
25
- React.createElement("tbody", null, rows.map((row, ri) => (React.createElement("tr", { key: ri }, row.map((cell, ci) => React.createElement("td", { key: ci }, String(cell ?? ""))))))))));
32
+ React.createElement("tbody", null, visibleRows.map((row, ri) => (React.createElement("tr", { key: ri }, row.map((cell, ci) => (React.createElement("td", { key: ci, "data-label": columns[ci] }, String(cell ?? ""))))))))),
33
+ rows.length > INITIAL_ROWS && (React.createElement("button", { className: "mcp-table-expand-btn", onClick: () => setShowAll((s) => !s) }, showAll
34
+ ? "▲ Show less"
35
+ : `▼ Show ${hiddenCount} more row${hiddenCount !== 1 ? "s" : ""}`))));
26
36
  }
27
37
  /**
28
38
  * Returns the ReactMarkdown `components` map.
@@ -1 +1 @@
1
- {"version":3,"file":"api-helpers.d.ts","sourceRoot":"","sources":["../src/api-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC;;;OAGG;IACH,0BAA0B,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;CACjD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,sBAAsB,IACnD,SAAS,OAAO,uBAuH/B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,KACrB,SAAS,OAAO,uBAU/B;AAED;;GAEG;AACH,wBAAsB,iBAAiB,kBAKtC"}
1
+ {"version":3,"file":"api-helpers.d.ts","sourceRoot":"","sources":["../src/api-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC;;;OAGG;IACH,0BAA0B,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;CACjD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,sBAAsB,IACnD,SAAS,OAAO,uBA0H/B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,KACrB,SAAS,OAAO,uBAW/B;AAED;;GAEG;AACH,wBAAsB,iBAAiB,kBAKtC"}
@@ -9,9 +9,10 @@ const clients = new Map();
9
9
  */
10
10
  export function createMCPChatHandler(config) {
11
11
  return async (request) => {
12
- const { message, context, sessionId = "default", bypassSystemPrompt = false } = await request.json();
12
+ const { message, context, sessionId = "default", bypassSystemPrompt = false, systemPromptName = "system-prompt" } = await request.json();
13
13
  // Get or create client for this session
14
- let client = clients.get(sessionId);
14
+ const cacheKey = `${sessionId}:${systemPromptName}`;
15
+ let client = clients.get(cacheKey);
15
16
  if (!client) {
16
17
  client = new MCPClientOpenAI({
17
18
  openaiApiKey: config.openaiApiKey,
@@ -20,9 +21,11 @@ export function createMCPChatHandler(config) {
20
21
  logDir: config.logDir || process.env.MCP_LOG_DIR,
21
22
  enableCodeInterpreter: config.enableCodeInterpreter,
22
23
  codeInterpreterMemoryLimit: config.codeInterpreterMemoryLimit,
24
+ systemPromptName,
25
+ systemPromptArgs: sessionId !== "default" ? { company_number: sessionId } : {},
23
26
  });
24
27
  await client.connect();
25
- clients.set(sessionId, client);
28
+ clients.set(cacheKey, client);
26
29
  }
27
30
  // Create an AbortController to handle client disconnection
28
31
  const abortController = new AbortController();
@@ -118,8 +121,9 @@ export function createMCPChatHandler(config) {
118
121
  */
119
122
  export function createMCPClearHandler() {
120
123
  return async (request) => {
121
- const { sessionId = "default" } = await request.json();
122
- const client = clients.get(sessionId);
124
+ const { sessionId = "default", systemPromptName = "system-prompt" } = await request.json();
125
+ const cacheKey = `${sessionId}:${systemPromptName}`;
126
+ const client = clients.get(cacheKey);
123
127
  if (client) {
124
128
  client.clearHistory();
125
129
  }
@@ -57,6 +57,17 @@ export interface MCPClientConfig {
57
57
  * Omit to use OpenAI's default (1 GB).
58
58
  */
59
59
  codeInterpreterMemoryLimit?: "1g" | "2g" | "4g";
60
+ /**
61
+ * Name of the MCP prompt to use as the system prompt.
62
+ * Defaults to "system-prompt".
63
+ */
64
+ systemPromptName?: string;
65
+ /**
66
+ * Optional arguments to pass when fetching the system prompt from the MCP server.
67
+ * Required when the prompt has a non-empty argsSchema (e.g. company_financial_synopsis needs company_number).
68
+ * Defaults to {} (no arguments).
69
+ */
70
+ systemPromptArgs?: Record<string, string>;
60
71
  }
61
72
  interface UsageStats {
62
73
  inputTokens: number;
@@ -1 +1 @@
1
- {"version":3,"file":"openai-client.d.ts","sourceRoot":"","sources":["../src/openai-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAsEH,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;IAEnC;;;;OAIG;IACH,2BAA2B,CAAC,EAAE,MAAM,CAAC;IAErC;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC;;;;;OAKG;IACH,0BAA0B,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;CACjD;AAID,UAAU,UAAU;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;CACxB;AAiBD,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAuB;IAExC;;;OAGG;IACH,OAAO,CAAC,YAAY,CAAuB;IAE3C;;;OAGG;IACH,OAAO,CAAC,mBAAmB,CAA2B;IAEtD;;;OAGG;IACH,OAAO,CAAC,UAAU,CAGhB;IAEF;;OAEG;IACH,OAAO,CAAC,eAAe,CAAK;IAE5B;;OAEG;IACH,OAAO,CAAC,SAAS,CAOf;IAEF;;;;OAIG;IACH,OAAO,CAAC,SAAS,CAKf;IAEF,OAAO,CAAC,MAAM,CAAsH;IACpI,OAAO,CAAC,MAAM,CAAa;gBAEf,MAAM,EAAE,eAAe;IAyC7B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAKxB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B,YAAY,IAAI,IAAI;IAmBpB,QAAQ,IAAI,UAAU;IAItB;;;OAGG;YACW,kBAAkB;IA0BhC;;;OAGG;IACH,OAAO,CAAC,UAAU;IAalB;;;OAGG;YACW,gBAAgB;IAuB9B;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAUhC;;OAEG;IACH,OAAO,CAAC,SAAS;IAIjB;;;;;;;;OAQG;IACH,OAAO,CAAC,YAAY;IAmCpB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA8EzB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,kBAAkB;IAQ1B;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;IA2CzB;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAsC9B;;OAEG;YACW,kBAAkB;IA4DhC;;;OAGG;YACW,mBAAmB;IAoBjC;;;OAGG;IACH,OAAO,CAAC,8BAA8B;IAatC;;OAEG;YACW,UAAU;IAuBxB;;OAEG;YACW,cAAc;IAqC5B;;OAEG;IACG,YAAY,CAChB,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,EACtC,WAAW,CAAC,EAAE,WAAW,EACzB,kBAAkB,UAAQ,GACzB,OAAO,CAAC,MAAM,CAAC;IA2RlB;;OAEG;YACW,eAAe;CAgI9B"}
1
+ {"version":3,"file":"openai-client.d.ts","sourceRoot":"","sources":["../src/openai-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAsEH,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;IAEnC;;;;OAIG;IACH,2BAA2B,CAAC,EAAE,MAAM,CAAC;IAErC;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC;;;;;OAKG;IACH,0BAA0B,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAEhD;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C;AAID,UAAU,UAAU;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;CACxB;AAiBD,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAuB;IAExC;;;OAGG;IACH,OAAO,CAAC,YAAY,CAAuB;IAE3C;;;OAGG;IACH,OAAO,CAAC,mBAAmB,CAA2B;IAEtD;;;OAGG;IACH,OAAO,CAAC,UAAU,CAGhB;IAEF;;OAEG;IACH,OAAO,CAAC,eAAe,CAAK;IAE5B;;OAEG;IACH,OAAO,CAAC,SAAS,CAOf;IAEF;;;;OAIG;IACH,OAAO,CAAC,SAAS,CAKf;IAEF,OAAO,CAAC,MAAM,CAA0L;IACxM,OAAO,CAAC,MAAM,CAAa;gBAEf,MAAM,EAAE,eAAe;IA2C7B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAKxB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B,YAAY,IAAI,IAAI;IAmBpB,QAAQ,IAAI,UAAU;IAItB;;;OAGG;YACW,kBAAkB;IA8BhC;;;OAGG;IACH,OAAO,CAAC,UAAU;IAalB;;;OAGG;YACW,gBAAgB;IAuB9B;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAUhC;;OAEG;IACH,OAAO,CAAC,SAAS;IAIjB;;;;;;;;OAQG;IACH,OAAO,CAAC,YAAY;IAmCpB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA8EzB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,kBAAkB;IAQ1B;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;IA2CzB;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAsC9B;;OAEG;YACW,kBAAkB;IA4DhC;;;OAGG;YACW,mBAAmB;IAoBjC;;;OAGG;IACH,OAAO,CAAC,8BAA8B;IAatC;;OAEG;YACW,UAAU;IAuBxB;;OAEG;YACW,cAAc;IAqC5B;;OAEG;IACG,YAAY,CAChB,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,EACtC,WAAW,CAAC,EAAE,WAAW,EACzB,kBAAkB,UAAQ,GACzB,OAAO,CAAC,MAAM,CAAC;IA2RlB;;OAEG;YACW,eAAe;CAgI9B"}
@@ -140,6 +140,8 @@ export class MCPClientOpenAI {
140
140
  logDir: config.logDir ?? process.env.MCP_LOG_DIR ?? path.resolve(process.cwd(), "logs"),
141
141
  enableCodeInterpreter: config.enableCodeInterpreter ?? false,
142
142
  codeInterpreterMemoryLimit: config.codeInterpreterMemoryLimit,
143
+ systemPromptName: config.systemPromptName ?? "system-prompt",
144
+ systemPromptArgs: config.systemPromptArgs ?? {},
143
145
  };
144
146
  this.logger = new McpLogger(this.config.logDir);
145
147
  this.openai = new OpenAI({
@@ -198,7 +200,11 @@ export class MCPClientOpenAI {
198
200
  try {
199
201
  // SDK typing may not expose getPrompt.
200
202
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
201
- const result = await this.client.getPrompt({ name: "system-prompt" });
203
+ const promptArgs = this.config.systemPromptArgs;
204
+ const result = await this.client.getPrompt({
205
+ name: this.config.systemPromptName,
206
+ ...(Object.keys(promptArgs).length > 0 && { arguments: promptArgs }),
207
+ });
202
208
  const parts = [];
203
209
  for (const msg of result.messages ?? []) {
204
210
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -963,3 +963,205 @@
963
963
  display: flex;
964
964
  gap: 8px;
965
965
  }
966
+
967
+ /* ───────────────────────────────────────────────
968
+ Table: expand / collapse button
969
+ ─────────────────────────────────────────────── */
970
+ .mcp-table-expand-btn {
971
+ display: block;
972
+ width: 100%;
973
+ padding: 10px 16px;
974
+ min-height: 44px;
975
+ font-size: 13px;
976
+ font-weight: 600;
977
+ font-family: inherit;
978
+ color: var(--mcp-primary-color);
979
+ background: transparent;
980
+ border: 1px solid var(--mcp-border);
981
+ border-top: none;
982
+ border-radius: 0 0 6px 6px;
983
+ cursor: pointer;
984
+ text-align: center;
985
+ transition: background 0.15s;
986
+ }
987
+
988
+ .mcp-table-expand-btn:hover {
989
+ background: rgba(78, 161, 255, 0.06);
990
+ }
991
+
992
+ /* ───────────────────────────────────────────────
993
+ Mobile: full-screen panel + compact layout
994
+ ─────────────────────────────────────────────── */
995
+ @media (max-width: 640px) {
996
+ /* Panel takes the full viewport */
997
+ .mcp-overlay {
998
+ padding: 0;
999
+ align-items: stretch;
1000
+ }
1001
+
1002
+ .mcp-panel {
1003
+ width: 100vw;
1004
+ height: 100dvh;
1005
+ max-height: 100dvh;
1006
+ margin-top: 0;
1007
+ border-radius: 0;
1008
+ border: none;
1009
+ }
1010
+
1011
+ /* Tighter header */
1012
+ .mcp-chat-header {
1013
+ padding: 10px 14px;
1014
+ }
1015
+
1016
+ .mcp-chat-title {
1017
+ font-size: 17px;
1018
+ }
1019
+
1020
+ /* Ensure all interactive elements in header meet 44px tap target */
1021
+ .mcp-chat-button,
1022
+ .mcp-btn-theme,
1023
+ .mcp-btn-icon {
1024
+ min-height: 44px;
1025
+ min-width: 44px;
1026
+ display: inline-flex;
1027
+ align-items: center;
1028
+ justify-content: center;
1029
+ }
1030
+
1031
+ /* Hide dev-tool button on mobile — not relevant to end users */
1032
+ .mcp-btn-dev {
1033
+ display: none;
1034
+ }
1035
+
1036
+ /* Messages: less padding */
1037
+ .mcp-chat-messages {
1038
+ padding: 10px 12px;
1039
+ gap: 12px;
1040
+ }
1041
+
1042
+ /* Message bubbles: use full available width */
1043
+ .mcp-chat-message,
1044
+ .mcp-chat-message-assistant {
1045
+ max-width: 100%;
1046
+ }
1047
+
1048
+ /* Tighter bubble padding */
1049
+ .mcp-chat-message-bubble {
1050
+ padding: 10px 14px;
1051
+ }
1052
+
1053
+ /* Input bar */
1054
+ .mcp-chat-input-form {
1055
+ padding: 10px 12px;
1056
+ gap: 8px;
1057
+ }
1058
+
1059
+ .mcp-chat-input {
1060
+ font-size: 16px; /* Prevent iOS auto-zoom on focus */
1061
+ }
1062
+
1063
+ /* Home screen: 2-column grid */
1064
+ .mcp-action-grid {
1065
+ grid-template-columns: repeat(2, 1fr);
1066
+ gap: 10px;
1067
+ }
1068
+
1069
+ .mcp-action-card {
1070
+ padding: 14px 10px;
1071
+ min-height: 72px;
1072
+ }
1073
+
1074
+ .mcp-action-card-icon {
1075
+ font-size: 24px;
1076
+ }
1077
+
1078
+ .mcp-action-card-label {
1079
+ font-size: 13px;
1080
+ }
1081
+
1082
+ .mcp-chat-now-button {
1083
+ min-height: 44px;
1084
+ padding: 10px 28px;
1085
+ }
1086
+
1087
+ /* Thinking panel */
1088
+ .mcp-chat-thinking {
1089
+ padding: 14px 16px;
1090
+ min-height: unset;
1091
+ }
1092
+ }
1093
+
1094
+ /* ───────────────────────────────────────────────
1095
+ Mobile: json-table card layout
1096
+ Each row becomes a labelled card; column headers
1097
+ are hidden and surfaced via data-label pseudo-elements.
1098
+ ─────────────────────────────────────────────── */
1099
+ @media (max-width: 640px) {
1100
+ .mcp-data-table-wrapper {
1101
+ overflow-x: visible;
1102
+ }
1103
+
1104
+ .mcp-data-table {
1105
+ min-width: unset;
1106
+ display: block;
1107
+ }
1108
+
1109
+ .mcp-data-table thead {
1110
+ display: none; /* labels come from data-label on each td */
1111
+ }
1112
+
1113
+ .mcp-data-table tbody {
1114
+ display: block;
1115
+ }
1116
+
1117
+ .mcp-data-table tr {
1118
+ display: block;
1119
+ border: 1px solid var(--mcp-border);
1120
+ border-radius: 8px;
1121
+ margin-bottom: 10px;
1122
+ overflow: hidden;
1123
+ }
1124
+
1125
+ .mcp-data-table td {
1126
+ display: grid;
1127
+ grid-template-columns: minmax(80px, 36%) 1fr;
1128
+ gap: 8px;
1129
+ padding: 8px 12px;
1130
+ border: none;
1131
+ border-bottom: 1px solid var(--mcp-border);
1132
+ font-size: 14px;
1133
+ line-height: 1.45;
1134
+ word-break: break-word;
1135
+ }
1136
+
1137
+ .mcp-data-table td:last-child {
1138
+ border-bottom: none;
1139
+ }
1140
+
1141
+ /* Column label shown from the data-label attribute */
1142
+ .mcp-data-table td::before {
1143
+ content: attr(data-label);
1144
+ font-weight: 700;
1145
+ font-size: 11px;
1146
+ text-transform: uppercase;
1147
+ letter-spacing: 0.06em;
1148
+ color: var(--mcp-text-secondary);
1149
+ align-self: center;
1150
+ line-height: 1.3;
1151
+ }
1152
+
1153
+ /* Strip alternating row tints — card borders provide separation */
1154
+ .mcp-data-table tbody tr:nth-child(even) {
1155
+ background: transparent;
1156
+ }
1157
+
1158
+ .mcp-data-table tbody tr:hover {
1159
+ background: transparent;
1160
+ }
1161
+
1162
+ /* Expand button full-width on mobile */
1163
+ .mcp-table-expand-btn {
1164
+ border-radius: 0 0 8px 8px;
1165
+ font-size: 14px;
1166
+ }
1167
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nqminds/mcp-client",
3
- "version": "1.0.33",
3
+ "version": "1.0.35",
4
4
  "description": "Reusable MCP client component with AI chat interface",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",