langsmith-mcp-server 0.1.1

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 (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +199 -0
  3. package/dist/common/formatters.d.ts +28 -0
  4. package/dist/common/formatters.d.ts.map +1 -0
  5. package/dist/common/formatters.js +150 -0
  6. package/dist/common/formatters.js.map +1 -0
  7. package/dist/common/helpers.d.ts +91 -0
  8. package/dist/common/helpers.d.ts.map +1 -0
  9. package/dist/common/helpers.js +341 -0
  10. package/dist/common/helpers.js.map +1 -0
  11. package/dist/common/pagination.d.ts +36 -0
  12. package/dist/common/pagination.d.ts.map +1 -0
  13. package/dist/common/pagination.js +187 -0
  14. package/dist/common/pagination.js.map +1 -0
  15. package/dist/index.d.ts +8 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +18 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/server.d.ts +16 -0
  20. package/dist/server.d.ts.map +1 -0
  21. package/dist/server.js +20 -0
  22. package/dist/server.js.map +1 -0
  23. package/dist/services/register-tools.d.ts +9 -0
  24. package/dist/services/register-tools.d.ts.map +1 -0
  25. package/dist/services/register-tools.js +589 -0
  26. package/dist/services/register-tools.js.map +1 -0
  27. package/dist/services/tools/datasets.d.ts +60 -0
  28. package/dist/services/tools/datasets.d.ts.map +1 -0
  29. package/dist/services/tools/datasets.js +221 -0
  30. package/dist/services/tools/datasets.js.map +1 -0
  31. package/dist/services/tools/experiments.d.ts +18 -0
  32. package/dist/services/tools/experiments.d.ts.map +1 -0
  33. package/dist/services/tools/experiments.js +81 -0
  34. package/dist/services/tools/experiments.js.map +1 -0
  35. package/dist/services/tools/prompts.d.ts +26 -0
  36. package/dist/services/tools/prompts.d.ts.map +1 -0
  37. package/dist/services/tools/prompts.js +87 -0
  38. package/dist/services/tools/prompts.js.map +1 -0
  39. package/dist/services/tools/traces.d.ts +80 -0
  40. package/dist/services/tools/traces.d.ts.map +1 -0
  41. package/dist/services/tools/traces.js +271 -0
  42. package/dist/services/tools/traces.js.map +1 -0
  43. package/dist/services/tools/usage.d.ts +16 -0
  44. package/dist/services/tools/usage.d.ts.map +1 -0
  45. package/dist/services/tools/usage.js +170 -0
  46. package/dist/services/tools/usage.js.map +1 -0
  47. package/package.json +36 -0
@@ -0,0 +1,341 @@
1
+ /**
2
+ * Helper functions for the LangSmith MCP server.
3
+ */
4
+ import { Client } from "langsmith";
5
+ /**
6
+ * Create a LangSmith client from environment variables.
7
+ *
8
+ * Reads LANGSMITH_API_KEY (required), LANGSMITH_ENDPOINT (optional),
9
+ * and LANGSMITH_WORKSPACE_ID (optional) from the environment.
10
+ *
11
+ * @returns LangSmith Client instance
12
+ * @throws Error if LANGSMITH_API_KEY is not set
13
+ */
14
+ export function getLangSmithClient() {
15
+ const apiKey = process.env.LANGSMITH_API_KEY;
16
+ if (!apiKey) {
17
+ throw new Error("API key not found. Set LANGSMITH_API_KEY environment variable.");
18
+ }
19
+ return new Client({
20
+ apiKey,
21
+ apiUrl: process.env.LANGSMITH_ENDPOINT || undefined,
22
+ workspaceId: process.env.LANGSMITH_WORKSPACE_ID || undefined,
23
+ });
24
+ }
25
+ /**
26
+ * Get API key and endpoint from environment variables.
27
+ * Used by tools that call LangSmith REST APIs directly (e.g. billing/usage).
28
+ *
29
+ * @returns Tuple of [apiKey, endpoint]. Endpoint is normalized (no trailing slash).
30
+ * @throws Error if LANGSMITH_API_KEY is not set
31
+ */
32
+ export function getApiKeyAndEndpoint() {
33
+ const apiKey = process.env.LANGSMITH_API_KEY;
34
+ if (!apiKey) {
35
+ throw new Error("API key not found. Set LANGSMITH_API_KEY environment variable.");
36
+ }
37
+ const endpoint = (process.env.LANGSMITH_ENDPOINT || "https://api.smith.langchain.com").replace(/\/+$/, "");
38
+ return [apiKey, endpoint];
39
+ }
40
+ /**
41
+ * Extract a LangGraph app host name from run stats.
42
+ *
43
+ * @param runStats - The run stats object
44
+ * @returns The LangGraph app host name, or undefined if not found
45
+ */
46
+ export function getLanggraphAppHostName(runStats) {
47
+ if (!runStats || !runStats.run_facets)
48
+ return undefined;
49
+ const runFacets = runStats.run_facets;
50
+ if (!Array.isArray(runFacets))
51
+ return undefined;
52
+ for (const runFacet of runFacets) {
53
+ if (typeof runFacet !== "object" || runFacet === null)
54
+ continue;
55
+ try {
56
+ for (const rfk of Object.keys(runFacet)) {
57
+ const match = rfk.match(/https?:\/\/(?<langgraphHost>[^/]+)/);
58
+ if (match?.groups?.langgraphHost) {
59
+ return match.groups.langgraphHost;
60
+ }
61
+ }
62
+ }
63
+ catch {
64
+ continue;
65
+ }
66
+ }
67
+ return undefined;
68
+ }
69
+ /**
70
+ * Parse the as_of parameter, converting ISO timestamps to Date objects
71
+ * while leaving version tags as strings.
72
+ *
73
+ * @param asOf - Dataset version tag OR ISO timestamp string
74
+ * @returns Date object if asOf is a valid ISO timestamp, otherwise the original string
75
+ */
76
+ export function parseAsOfParameter(asOf) {
77
+ try {
78
+ const date = new Date(asOf);
79
+ if (!isNaN(date.getTime())) {
80
+ return date;
81
+ }
82
+ }
83
+ catch {
84
+ // Not a valid date, return as string (version tag)
85
+ }
86
+ return asOf;
87
+ }
88
+ /**
89
+ * Recursively search for a key in a nested dictionary or list.
90
+ * Returns the first occurrence found during depth-first traversal.
91
+ *
92
+ * @param data - The data structure to search in
93
+ * @param key - The key to search for
94
+ * @returns The value associated with the key if found, otherwise undefined
95
+ */
96
+ export function findInDict(data, key) {
97
+ if (typeof data === "object" && data !== null && !Array.isArray(data)) {
98
+ const obj = data;
99
+ if (key in obj) {
100
+ return obj[key];
101
+ }
102
+ for (const value of Object.values(obj)) {
103
+ const result = findInDict(value, key);
104
+ if (result !== undefined) {
105
+ return result;
106
+ }
107
+ }
108
+ }
109
+ else if (Array.isArray(data)) {
110
+ for (const item of data) {
111
+ const result = findInDict(item, key);
112
+ if (result !== undefined) {
113
+ return result;
114
+ }
115
+ }
116
+ }
117
+ return undefined;
118
+ }
119
+ /**
120
+ * Recursively convert Date objects to ISO strings in data structures.
121
+ * Note: In the JS SDK, UUIDs are already strings, unlike the Python SDK
122
+ * where they are uuid.UUID objects. This function primarily handles Dates.
123
+ */
124
+ export function convertToSerializable(obj) {
125
+ if (obj instanceof Date) {
126
+ return obj.toISOString();
127
+ }
128
+ if (typeof obj === "bigint") {
129
+ return obj.toString();
130
+ }
131
+ if (Array.isArray(obj)) {
132
+ return obj.map(convertToSerializable);
133
+ }
134
+ if (typeof obj === "object" && obj !== null) {
135
+ const result = {};
136
+ for (const [key, value] of Object.entries(obj)) {
137
+ result[key] = convertToSerializable(value);
138
+ }
139
+ return result;
140
+ }
141
+ return obj;
142
+ }
143
+ /**
144
+ * Recursively count the total number of characters in a data structure.
145
+ */
146
+ export function countCharacters(obj) {
147
+ if (typeof obj === "string") {
148
+ return obj.length;
149
+ }
150
+ if (typeof obj === "object" && obj !== null && !Array.isArray(obj)) {
151
+ let count = 0;
152
+ for (const value of Object.values(obj)) {
153
+ count += countCharacters(value);
154
+ }
155
+ return count;
156
+ }
157
+ if (Array.isArray(obj)) {
158
+ let count = 0;
159
+ for (const item of obj) {
160
+ count += countCharacters(item);
161
+ }
162
+ return count;
163
+ }
164
+ // For other types, convert to string and count
165
+ return String(obj).length;
166
+ }
167
+ /**
168
+ * Recursively count the total number of fields/keys in a data structure.
169
+ */
170
+ export function countFields(obj) {
171
+ if (typeof obj === "object" && obj !== null && !Array.isArray(obj)) {
172
+ let count = Object.keys(obj).length;
173
+ for (const value of Object.values(obj)) {
174
+ count += countFields(value);
175
+ }
176
+ return count;
177
+ }
178
+ if (Array.isArray(obj)) {
179
+ let count = 0;
180
+ for (const item of obj) {
181
+ count += countFields(item);
182
+ }
183
+ return count;
184
+ }
185
+ return 0;
186
+ }
187
+ /**
188
+ * Filter a run dictionary to only include selected fields.
189
+ * If select is undefined or empty, returns the full dictionary.
190
+ */
191
+ export function filterFields(runDict, select) {
192
+ if (!select || select.length === 0) {
193
+ return runDict;
194
+ }
195
+ const filtered = {};
196
+ for (const field of select) {
197
+ if (field in runDict) {
198
+ filtered[field] = runDict[field];
199
+ }
200
+ }
201
+ return filtered;
202
+ }
203
+ /**
204
+ * Build a simplified trace tree structure showing top-level fields
205
+ * with metrics for nested content.
206
+ *
207
+ * @param runDict - The dictionary to build a tree from
208
+ * @param depth - How many levels deep to show actual content before summarizing.
209
+ * 0 = summarize all nested structures (default)
210
+ */
211
+ export function buildTraceTree(runDict, depth = 0) {
212
+ const tree = {};
213
+ for (const [key, value] of Object.entries(runDict)) {
214
+ if (typeof value === "object" && value !== null && !Array.isArray(value)) {
215
+ const dictValue = value;
216
+ const keys = Object.keys(dictValue);
217
+ if (keys.length === 0) {
218
+ tree[key] = {};
219
+ }
220
+ else if (depth > 0) {
221
+ tree[key] = buildTraceTree(dictValue, depth - 1);
222
+ }
223
+ else {
224
+ const fieldCount = countFields(dictValue);
225
+ if (fieldCount === 0) {
226
+ tree[key] = {};
227
+ }
228
+ else {
229
+ tree[key] = {
230
+ _type: "dict",
231
+ _field_count: fieldCount,
232
+ _character_count: countCharacters(dictValue),
233
+ _keys: keys.slice(0, 10),
234
+ };
235
+ }
236
+ }
237
+ }
238
+ else if (Array.isArray(value)) {
239
+ if (value.length === 0) {
240
+ tree[key] = [];
241
+ }
242
+ else if (depth > 0) {
243
+ const processedItems = [];
244
+ for (const item of value) {
245
+ if (typeof item === "object" &&
246
+ item !== null &&
247
+ !Array.isArray(item)) {
248
+ processedItems.push(buildTraceTree(item, depth - 1));
249
+ }
250
+ else if (Array.isArray(item)) {
251
+ processedItems.push(item.map((subitem) => typeof subitem === "object" &&
252
+ subitem !== null &&
253
+ !Array.isArray(subitem)
254
+ ? buildTraceTree(subitem, depth - 1)
255
+ : subitem));
256
+ }
257
+ else {
258
+ processedItems.push(item);
259
+ }
260
+ }
261
+ tree[key] = processedItems;
262
+ }
263
+ else {
264
+ const preview = [];
265
+ for (const item of value.slice(0, 2)) {
266
+ if (typeof item === "object" &&
267
+ item !== null &&
268
+ !Array.isArray(item)) {
269
+ preview.push({
270
+ _type: "dict",
271
+ _keys: Object.keys(item).slice(0, 5),
272
+ });
273
+ }
274
+ else if (Array.isArray(item)) {
275
+ preview.push({ _type: "list", _length: item.length });
276
+ }
277
+ else {
278
+ const strVal = String(item);
279
+ preview.push(strVal.length > 100 ? strVal.slice(0, 100) : strVal);
280
+ }
281
+ }
282
+ tree[key] = {
283
+ _type: "list",
284
+ _length: value.length,
285
+ _field_count: countFields(value),
286
+ _character_count: countCharacters(value),
287
+ _preview: preview,
288
+ };
289
+ }
290
+ }
291
+ else {
292
+ tree[key] = value;
293
+ }
294
+ }
295
+ return tree;
296
+ }
297
+ /**
298
+ * Parse a JSON array string into an array of strings.
299
+ * If the value starts with "[", parse as JSON array.
300
+ * Otherwise, wrap in a single-element array.
301
+ */
302
+ export function parseJsonArray(value) {
303
+ if (!value)
304
+ return undefined;
305
+ if (value.startsWith("[")) {
306
+ try {
307
+ return JSON.parse(value);
308
+ }
309
+ catch {
310
+ return [value];
311
+ }
312
+ }
313
+ return [value];
314
+ }
315
+ /**
316
+ * Parse a JSON object string into a Record.
317
+ * If the value starts with "{", parse as JSON object.
318
+ * Otherwise, return undefined.
319
+ */
320
+ export function parseJsonObject(value) {
321
+ if (!value)
322
+ return undefined;
323
+ if (value.startsWith("{")) {
324
+ try {
325
+ return JSON.parse(value);
326
+ }
327
+ catch {
328
+ return undefined;
329
+ }
330
+ }
331
+ return undefined;
332
+ }
333
+ /**
334
+ * Parse a boolean string ("true"/"false") to a boolean value.
335
+ */
336
+ export function parseBoolString(value) {
337
+ if (value === undefined)
338
+ return undefined;
339
+ return value.toLowerCase() === "true";
340
+ }
341
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/common/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Char-based pagination for LangSmith runs.
3
+ *
4
+ * Stateless: each request fetches all runs for the trace (up to a safe bound),
5
+ * builds pages by character budget, and returns the requested page only.
6
+ * No cursor, no offset, no server-side state. Optimized for LLM callers (simple integers).
7
+ */
8
+ /** LangSmith API maximum; do not exceed */
9
+ export declare const MAX_RUNS_PER_TRACE = 100;
10
+ /**
11
+ * Recursively truncate long strings to previewChars; suffix with "... (+N chars)".
12
+ */
13
+ export declare function truncateStrings(obj: unknown, previewChars: number): unknown;
14
+ /**
15
+ * Split runs into pages by character budget (JSON length).
16
+ * If a single run exceeds the budget, it is returned alone on a page.
17
+ */
18
+ export declare function buildPagesByCharBudget(runsDict: Record<string, unknown>[], maxCharsPerPage: number): Record<string, unknown>[][];
19
+ /**
20
+ * Return one page of runs (char-based pagination).
21
+ *
22
+ * - Applies previewChars truncation to each run if previewChars > 0.
23
+ * - Builds pages by accumulating JSON length up to maxCharsPerPage.
24
+ * - pageNumber is 1-based. Out-of-range returns empty runs.
25
+ * - Ensures the returned page JSON never exceeds maxCharsPerPage.
26
+ *
27
+ * @returns Dict with keys: runs, page_number, total_pages, max_chars_per_page, preview_chars.
28
+ * May include _truncated, _truncated_message, _truncated_preview if content was cut.
29
+ */
30
+ export declare function paginateRuns(runsDict: Record<string, unknown>[], pageNumber: number, maxCharsPerPage: number, previewChars?: number): Record<string, unknown>;
31
+ /**
32
+ * Return one page of messages (char-based pagination), same semantics as paginateRuns.
33
+ * Uses "result" as the key for the message list.
34
+ */
35
+ export declare function paginateMessages(messagesDict: Record<string, unknown>[], pageNumber: number, maxCharsPerPage: number, previewChars?: number): Record<string, unknown>;
36
+ //# sourceMappingURL=pagination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../src/common/pagination.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,2CAA2C;AAC3C,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAEtC;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CA0B3E;AAwGD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EACnC,eAAe,EAAE,MAAM,GACtB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,CAyB7B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EACnC,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,EACvB,YAAY,GAAE,MAAU,GACvB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA0BzB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EACvC,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,EACvB,YAAY,GAAE,MAAU,GACvB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA0BzB"}
@@ -0,0 +1,187 @@
1
+ /**
2
+ * Char-based pagination for LangSmith runs.
3
+ *
4
+ * Stateless: each request fetches all runs for the trace (up to a safe bound),
5
+ * builds pages by character budget, and returns the requested page only.
6
+ * No cursor, no offset, no server-side state. Optimized for LLM callers (simple integers).
7
+ */
8
+ /** LangSmith API maximum; do not exceed */
9
+ export const MAX_RUNS_PER_TRACE = 100;
10
+ /**
11
+ * Recursively truncate long strings to previewChars; suffix with "... (+N chars)".
12
+ */
13
+ export function truncateStrings(obj, previewChars) {
14
+ if (previewChars <= 0) {
15
+ return obj;
16
+ }
17
+ if (typeof obj === "string") {
18
+ if (obj.length <= previewChars) {
19
+ return obj;
20
+ }
21
+ return (obj.slice(0, previewChars) +
22
+ "\u2026 (+" +
23
+ (obj.length - previewChars) +
24
+ " chars)");
25
+ }
26
+ if (typeof obj === "object" && obj !== null && !Array.isArray(obj)) {
27
+ const result = {};
28
+ for (const [k, v] of Object.entries(obj)) {
29
+ result[k] = truncateStrings(v, previewChars);
30
+ }
31
+ return result;
32
+ }
33
+ if (Array.isArray(obj)) {
34
+ return obj.map((item) => truncateStrings(item, previewChars));
35
+ }
36
+ return obj;
37
+ }
38
+ /**
39
+ * Character count of JSON-serialized run (for budget).
40
+ */
41
+ function runCharCount(runDict) {
42
+ return JSON.stringify(runDict, (_key, value) => typeof value === "bigint" ? value.toString() : value).length;
43
+ }
44
+ /**
45
+ * Character count of the full page JSON. Use indent=0 for compact (budget-friendly).
46
+ */
47
+ function pageOutputSize(pageDict, indent = 0) {
48
+ return JSON.stringify(pageDict, (_key, value) => (typeof value === "bigint" ? value.toString() : value), indent || undefined).length;
49
+ }
50
+ /**
51
+ * If the page JSON exceeds maxCharsPerPage, truncate long strings inside
52
+ * pageDict[itemsKey] until the serialized output fits.
53
+ * If still over budget, return a dict with itemsKey=[] and _truncated_preview.
54
+ */
55
+ function enforcePageCharBudget(pageDict, maxCharsPerPage, options = {}) {
56
+ const { indent = 0, itemsKey = "runs" } = options;
57
+ if (pageOutputSize(pageDict, indent) <= maxCharsPerPage) {
58
+ return pageDict;
59
+ }
60
+ const items = pageDict[itemsKey];
61
+ if (!items || items.length === 0) {
62
+ return pageDict;
63
+ }
64
+ let low = 0;
65
+ let high = 100_000;
66
+ let bestPageDict = pageDict;
67
+ while (low <= high) {
68
+ const mid = Math.floor((low + high) / 2);
69
+ const truncatedItems = items.map((it) => truncateStrings(it, mid));
70
+ const testDict = { ...pageDict, [itemsKey]: truncatedItems };
71
+ const size = pageOutputSize(testDict, indent);
72
+ if (size <= maxCharsPerPage) {
73
+ bestPageDict = testDict;
74
+ low = mid + 1;
75
+ }
76
+ else {
77
+ high = mid - 1;
78
+ }
79
+ }
80
+ const bestSize = pageOutputSize(bestPageDict, indent);
81
+ if (bestSize > maxCharsPerPage) {
82
+ const jsonStr = JSON.stringify(bestPageDict, (_key, value) => (typeof value === "bigint" ? value.toString() : value), indent || undefined);
83
+ const suffix = "\n\u2026 (output truncated, exceeded max_chars_per_page)";
84
+ const overhead = 1000;
85
+ const safePreviewLen = (maxCharsPerPage - suffix.length - overhead) / 2;
86
+ const previewMax = Math.max(100, safePreviewLen);
87
+ const truncatedPreview = jsonStr.slice(0, previewMax) + suffix;
88
+ return {
89
+ ...Object.fromEntries(Object.entries(pageDict).filter(([k]) => k !== itemsKey)),
90
+ [itemsKey]: [],
91
+ page_number: pageDict.page_number,
92
+ total_pages: pageDict.total_pages,
93
+ max_chars_per_page: maxCharsPerPage,
94
+ preview_chars: pageDict.preview_chars ?? 0,
95
+ _truncated: true,
96
+ _truncated_message: "Page exceeded character budget; content truncated.",
97
+ _truncated_preview: truncatedPreview,
98
+ };
99
+ }
100
+ return bestPageDict;
101
+ }
102
+ /**
103
+ * Split runs into pages by character budget (JSON length).
104
+ * If a single run exceeds the budget, it is returned alone on a page.
105
+ */
106
+ export function buildPagesByCharBudget(runsDict, maxCharsPerPage) {
107
+ if (runsDict.length === 0) {
108
+ return [];
109
+ }
110
+ const pages = [];
111
+ let currentPage = [];
112
+ let currentChars = 0;
113
+ for (const run of runsDict) {
114
+ const runChars = runCharCount(run);
115
+ if (currentChars + runChars > maxCharsPerPage && currentPage.length > 0) {
116
+ pages.push(currentPage);
117
+ currentPage = [];
118
+ currentChars = 0;
119
+ }
120
+ currentPage.push(run);
121
+ currentChars += runChars;
122
+ }
123
+ if (currentPage.length > 0) {
124
+ pages.push(currentPage);
125
+ }
126
+ return pages;
127
+ }
128
+ /**
129
+ * Return one page of runs (char-based pagination).
130
+ *
131
+ * - Applies previewChars truncation to each run if previewChars > 0.
132
+ * - Builds pages by accumulating JSON length up to maxCharsPerPage.
133
+ * - pageNumber is 1-based. Out-of-range returns empty runs.
134
+ * - Ensures the returned page JSON never exceeds maxCharsPerPage.
135
+ *
136
+ * @returns Dict with keys: runs, page_number, total_pages, max_chars_per_page, preview_chars.
137
+ * May include _truncated, _truncated_message, _truncated_preview if content was cut.
138
+ */
139
+ export function paginateRuns(runsDict, pageNumber, maxCharsPerPage, previewChars = 0) {
140
+ if (previewChars > 0) {
141
+ runsDict = runsDict.map((r) => truncateStrings(r, previewChars));
142
+ }
143
+ const pages = buildPagesByCharBudget(runsDict, maxCharsPerPage);
144
+ const totalPages = pages.length;
145
+ let pageRuns;
146
+ if (pageNumber < 1 || pageNumber > totalPages) {
147
+ pageRuns = [];
148
+ }
149
+ else {
150
+ pageRuns = pages[pageNumber - 1];
151
+ }
152
+ const out = {
153
+ runs: pageRuns,
154
+ page_number: pageNumber,
155
+ total_pages: totalPages,
156
+ max_chars_per_page: maxCharsPerPage,
157
+ preview_chars: previewChars,
158
+ };
159
+ return enforcePageCharBudget(out, maxCharsPerPage);
160
+ }
161
+ /**
162
+ * Return one page of messages (char-based pagination), same semantics as paginateRuns.
163
+ * Uses "result" as the key for the message list.
164
+ */
165
+ export function paginateMessages(messagesDict, pageNumber, maxCharsPerPage, previewChars = 0) {
166
+ if (previewChars > 0) {
167
+ messagesDict = messagesDict.map((m) => truncateStrings(m, previewChars));
168
+ }
169
+ const pages = buildPagesByCharBudget(messagesDict, maxCharsPerPage);
170
+ const totalPages = pages.length;
171
+ let pageMessages;
172
+ if (pageNumber < 1 || pageNumber > totalPages) {
173
+ pageMessages = [];
174
+ }
175
+ else {
176
+ pageMessages = pages[pageNumber - 1];
177
+ }
178
+ const out = {
179
+ result: pageMessages,
180
+ page_number: pageNumber,
181
+ total_pages: totalPages,
182
+ max_chars_per_page: maxCharsPerPage,
183
+ preview_chars: previewChars,
184
+ };
185
+ return enforcePageCharBudget(out, maxCharsPerPage, { itemsKey: "result" });
186
+ }
187
+ //# sourceMappingURL=pagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/common/pagination.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * LangSmith MCP Server - TypeScript implementation.
4
+ *
5
+ * Entry point that creates the MCP server and connects it to stdio transport.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;GAIG"}
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * LangSmith MCP Server - TypeScript implementation.
4
+ *
5
+ * Entry point that creates the MCP server and connects it to stdio transport.
6
+ */
7
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
8
+ import { server } from "./server.js";
9
+ async function main() {
10
+ const transport = new StdioServerTransport();
11
+ await server.connect(transport);
12
+ console.error("LangSmith MCP server running on stdio");
13
+ }
14
+ main().catch((error) => {
15
+ console.error("Failed to start LangSmith MCP server:", error);
16
+ process.exit(1);
17
+ });
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;AACzD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;IAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * MCP server for LangSmith SDK integration.
3
+ * This server exposes methods to interact with LangSmith's observability platform:
4
+ * - get_thread_history: Fetch conversation history for a specific thread
5
+ * - get_prompts: Fetch prompts from LangSmith with optional filtering
6
+ * - pull_prompt: Pull a specific prompt by its name
7
+ * - fetch_runs: Fetch runs with flexible filters
8
+ * - list_projects: List LangSmith projects
9
+ * - list_datasets: Fetch datasets
10
+ * - list_examples: Fetch examples from datasets
11
+ * - list_experiments: List experiment projects
12
+ * - get_billing_usage: Fetch billing usage data
13
+ */
14
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
15
+ export declare const server: McpServer;
16
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,eAAO,MAAM,MAAM,WAGlB,CAAC"}
package/dist/server.js ADDED
@@ -0,0 +1,20 @@
1
+ /**
2
+ * MCP server for LangSmith SDK integration.
3
+ * This server exposes methods to interact with LangSmith's observability platform:
4
+ * - get_thread_history: Fetch conversation history for a specific thread
5
+ * - get_prompts: Fetch prompts from LangSmith with optional filtering
6
+ * - pull_prompt: Pull a specific prompt by its name
7
+ * - fetch_runs: Fetch runs with flexible filters
8
+ * - list_projects: List LangSmith projects
9
+ * - list_datasets: Fetch datasets
10
+ * - list_examples: Fetch examples from datasets
11
+ * - list_experiments: List experiment projects
12
+ * - get_billing_usage: Fetch billing usage data
13
+ */
14
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
15
+ import { registerTools } from "./services/register-tools.js";
16
+ // Create MCP server
17
+ export const server = new McpServer({ name: "LangSmith API MCP Server", version: "0.1.0" }, { capabilities: { logging: {} } });
18
+ // Register all tools with the server
19
+ registerTools(server);
20
+ //# sourceMappingURL=server.js.map