@testrelic/mcp 2.1.0 → 3.1.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.
Files changed (44) hide show
  1. package/LICENSE +661 -201
  2. package/README.md +58 -2
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/clients/cloud.d.ts +288 -3
  5. package/dist/clients/cloud.d.ts.map +1 -1
  6. package/dist/clients/cloud.js +223 -32
  7. package/dist/clients/cloud.js.map +1 -1
  8. package/dist/clients/http.d.ts +2 -0
  9. package/dist/clients/http.d.ts.map +1 -1
  10. package/dist/clients/http.js +6 -0
  11. package/dist/clients/http.js.map +1 -1
  12. package/dist/config.d.ts +4 -4
  13. package/dist/config.d.ts.map +1 -1
  14. package/dist/config.js +7 -0
  15. package/dist/config.js.map +1 -1
  16. package/dist/prompts/index.d.ts.map +1 -1
  17. package/dist/prompts/index.js +108 -0
  18. package/dist/prompts/index.js.map +1 -1
  19. package/dist/resources/index.d.ts +9 -1
  20. package/dist/resources/index.d.ts.map +1 -1
  21. package/dist/resources/index.js +118 -1
  22. package/dist/resources/index.js.map +1 -1
  23. package/dist/tools/ai/index.d.ts +3 -0
  24. package/dist/tools/ai/index.d.ts.map +1 -0
  25. package/dist/tools/ai/index.js +265 -0
  26. package/dist/tools/ai/index.js.map +1 -0
  27. package/dist/tools/apps/index.d.ts +3 -0
  28. package/dist/tools/apps/index.d.ts.map +1 -0
  29. package/dist/tools/apps/index.js +138 -0
  30. package/dist/tools/apps/index.js.map +1 -0
  31. package/dist/tools/artifacts/index.d.ts +3 -0
  32. package/dist/tools/artifacts/index.d.ts.map +1 -0
  33. package/dist/tools/artifacts/index.js +124 -0
  34. package/dist/tools/artifacts/index.js.map +1 -0
  35. package/dist/tools/index.d.ts.map +1 -1
  36. package/dist/tools/index.js +8 -0
  37. package/dist/tools/index.js.map +1 -1
  38. package/dist/tools/marketplace/index.d.ts +3 -0
  39. package/dist/tools/marketplace/index.d.ts.map +1 -0
  40. package/dist/tools/marketplace/index.js +194 -0
  41. package/dist/tools/marketplace/index.js.map +1 -0
  42. package/dist/version.d.ts +1 -1
  43. package/dist/version.js +1 -1
  44. package/package.json +5 -4
@@ -0,0 +1,265 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Ask AI capability — exposes cloud-platform-app's Ask AI surface to external
4
+ * MCP clients. The platform owns the LLM key, the agent loop, and the prompt
5
+ * templates. This file is a thin schema layer over `/api/v1/mcp/ai/*`.
6
+ *
7
+ * Two strategies for the long tail of platform tools:
8
+ * - Granular: one `tr_*` tool per high-value artifact generator (8 below).
9
+ * - Universal: `tr_ai_execute` for any platform tool by name (40+ on the
10
+ * platform). Keeps the MCP tool-schema prelude small while still allowing
11
+ * the agent to call any tool when needed.
12
+ */
13
+ const ArtifactSummary = z.object({
14
+ id: z.string().optional(),
15
+ type: z.string(),
16
+ payload: z.record(z.unknown()),
17
+ });
18
+ const ConversationSummary = z.object({
19
+ id: z.string(),
20
+ title: z.string(),
21
+ createdAt: z.string(),
22
+ updatedAt: z.string(),
23
+ messageCount: z.number(),
24
+ });
25
+ const Message = z.object({
26
+ id: z.string().optional(),
27
+ role: z.string(),
28
+ content: z.string(),
29
+ artifacts: z.array(z.record(z.unknown())).optional(),
30
+ });
31
+ function artifactGenerator(name, platformTool, artifactType, title, description) {
32
+ return {
33
+ name,
34
+ capability: "ai",
35
+ title,
36
+ description,
37
+ inputSchema: {
38
+ input: z.record(z.unknown()).describe("Tool-specific input. Refer to the platform's input_schema via `tr_ai_list_tools` for the exact shape."),
39
+ },
40
+ outputSchema: {
41
+ artifact: ArtifactSummary,
42
+ result: z.record(z.unknown()),
43
+ },
44
+ handler: async (input, ctx) => {
45
+ const args = (input.input ?? {});
46
+ const r = await ctx.clients.cloud.executeAiTool(platformTool, args);
47
+ const artifact = r.artifact ?? { type: artifactType, payload: r.result };
48
+ const summary = artifact.id ? ` (id: ${artifact.id})` : "";
49
+ const text = [
50
+ `## ${title}${summary}`,
51
+ "",
52
+ `Artifact type: \`${artifact.type}\``,
53
+ artifact.id ? `Resource: \`testrelic://artifacts/${artifact.id}\`` : "",
54
+ ]
55
+ .filter(Boolean)
56
+ .join("\n");
57
+ return { text, structured: { artifact, result: r.result } };
58
+ },
59
+ };
60
+ }
61
+ export const aiTools = [
62
+ {
63
+ name: "tr_ai_list_tools",
64
+ capability: "ai",
65
+ title: "List Ask-AI tools",
66
+ description: "Catalog of every AI tool the platform exposes. Use this before `tr_ai_execute` to discover available tools and their input schemas. Output is paginated-friendly (one entry per tool).",
67
+ inputSchema: {},
68
+ outputSchema: {
69
+ catalog: z.array(z.object({
70
+ name: z.string(),
71
+ category: z.string(),
72
+ description: z.string(),
73
+ output: z.enum(["text", "artifact"]),
74
+ artifactType: z.string().optional(),
75
+ inputSchema: z.record(z.unknown()),
76
+ })),
77
+ },
78
+ handler: async (_input, ctx) => {
79
+ const r = await ctx.clients.cloud.listAiTools();
80
+ const lines = [`## Ask-AI tools (${r.catalog.length})`, ""];
81
+ const byCategory = new Map();
82
+ for (const t of r.catalog) {
83
+ const arr = byCategory.get(t.category) ?? [];
84
+ arr.push(t);
85
+ byCategory.set(t.category, arr);
86
+ }
87
+ for (const [cat, tools] of byCategory) {
88
+ lines.push(`### ${cat}`);
89
+ for (const t of tools) {
90
+ const out = t.output === "artifact" ? `→ ${t.artifactType ?? "artifact"}` : "→ text";
91
+ lines.push(`- **${t.name}** ${out} — ${t.description.slice(0, 120)}`);
92
+ }
93
+ lines.push("");
94
+ }
95
+ return { text: lines.join("\n").trim(), structured: r };
96
+ },
97
+ },
98
+ {
99
+ name: "tr_ai_execute",
100
+ capability: "ai",
101
+ title: "Execute an Ask-AI tool",
102
+ description: "Invokes any AI tool by name. Body: { tool_name, input }. Returns { result, artifact? }. When the tool produces an artifact (dashboard, report, test_plan, presentation, navigation_paths, session_workspace), the artifact is also addressable as `testrelic://artifacts/{id}` after the call.",
103
+ inputSchema: {
104
+ tool_name: z.string().describe("Tool name from `tr_ai_list_tools` (e.g. query_test_runs, query_jira_issues)"),
105
+ input: z.record(z.unknown()).describe("Tool-specific input"),
106
+ },
107
+ outputSchema: {
108
+ result: z.record(z.unknown()),
109
+ artifact: ArtifactSummary.optional(),
110
+ },
111
+ handler: async (input, ctx) => {
112
+ const name = String(input.tool_name);
113
+ const args = (input.input ?? {});
114
+ const r = await ctx.clients.cloud.executeAiTool(name, args);
115
+ const text = r.artifact
116
+ ? `✓ ${name} produced ${r.artifact.type}${r.artifact.id ? ` (testrelic://artifacts/${r.artifact.id})` : ""}.`
117
+ : `✓ ${name} returned text result.`;
118
+ return { text, structured: r };
119
+ },
120
+ },
121
+ {
122
+ name: "tr_ask_ai",
123
+ capability: "ai",
124
+ title: "Ask AI (single turn)",
125
+ description: "Runs the Ask AI agent loop for a single user message. The platform handles LLM calls, tool orchestration, and artifact generation. Returns the assistant's response plus any artifacts it produced. Pass `conversationId` to continue an existing thread, or omit to start a new one.",
126
+ inputSchema: {
127
+ message: z.string().describe("User message"),
128
+ conversationId: z.string().optional(),
129
+ repoId: z.string().optional().describe("Repo context for grounding"),
130
+ runId: z.string().optional().describe("Specific run to focus on"),
131
+ maxToolRounds: z.number().int().min(1).max(15).optional(),
132
+ },
133
+ outputSchema: {
134
+ conversationId: z.string(),
135
+ messages: z.array(Message),
136
+ usage: z.object({ inputTokens: z.number(), outputTokens: z.number() }).optional(),
137
+ },
138
+ handler: async (input, ctx) => {
139
+ const r = await ctx.clients.cloud.runAgent({
140
+ messages: [{ role: "user", content: String(input.message) }],
141
+ conversationId: input.conversationId,
142
+ repoId: input.repoId,
143
+ runId: input.runId,
144
+ maxToolRounds: input.maxToolRounds,
145
+ });
146
+ const assistant = r.messages.filter((m) => m.role === "assistant").pop();
147
+ const text = assistant?.content ?? "_(no assistant reply)_";
148
+ return { text, structured: r };
149
+ },
150
+ },
151
+ {
152
+ name: "tr_ai_list_conversations",
153
+ capability: "ai",
154
+ title: "List Ask-AI conversations",
155
+ description: "Paginated list of conversations for the authenticated user. Use this to find a conversationId to continue.",
156
+ inputSchema: {
157
+ cursor: z.string().optional(),
158
+ limit: z.number().int().min(1).max(50).optional(),
159
+ },
160
+ outputSchema: {
161
+ conversations: z.array(ConversationSummary),
162
+ nextCursor: z.string().nullable(),
163
+ },
164
+ handler: async (input, ctx) => {
165
+ const r = await ctx.clients.cloud.listConversations({
166
+ cursor: input.cursor,
167
+ limit: input.limit,
168
+ });
169
+ const lines = [`## Conversations (${r.conversations.length})`, ""];
170
+ for (const c of r.conversations) {
171
+ lines.push(`- **${c.id}** — ${c.title} (${c.messageCount} msgs, updated ${c.updatedAt})`);
172
+ }
173
+ if (r.nextCursor)
174
+ lines.push("", `_Next cursor: \`${r.nextCursor}\`_`);
175
+ return { text: lines.join("\n"), structured: r };
176
+ },
177
+ },
178
+ {
179
+ name: "tr_ai_get_conversation",
180
+ capability: "ai",
181
+ title: "Get one Ask-AI conversation",
182
+ description: "Returns the full message history for one conversation, including artifact references on assistant turns.",
183
+ inputSchema: { id: z.string() },
184
+ outputSchema: {
185
+ id: z.string(),
186
+ title: z.string(),
187
+ messages: z.array(Message),
188
+ },
189
+ handler: async (input, ctx) => {
190
+ const r = await ctx.clients.cloud.getConversation(String(input.id));
191
+ const lines = [`## ${r.title}`, ""];
192
+ for (const m of r.messages) {
193
+ lines.push(`### ${m.role}`);
194
+ lines.push(m.content);
195
+ if (m.artifacts?.length)
196
+ lines.push(`_(${m.artifacts.length} artifact${m.artifacts.length === 1 ? "" : "s"} attached)_`);
197
+ lines.push("");
198
+ }
199
+ return { text: lines.join("\n").trim(), structured: r };
200
+ },
201
+ },
202
+ {
203
+ name: "tr_ai_new_conversation",
204
+ capability: "ai",
205
+ title: "Create a new conversation",
206
+ description: "Creates an empty conversation. Use the returned `id` as `conversationId` in subsequent `tr_ask_ai` calls.",
207
+ inputSchema: {
208
+ title: z.string().optional(),
209
+ repoId: z.string().optional(),
210
+ },
211
+ outputSchema: { id: z.string(), title: z.string() },
212
+ handler: async (input, ctx) => {
213
+ const r = await ctx.clients.cloud.createConversation({
214
+ title: input.title,
215
+ repoId: input.repoId,
216
+ });
217
+ return { text: `Created conversation ${r.id}: "${r.title}".`, structured: r };
218
+ },
219
+ },
220
+ {
221
+ name: "tr_ai_delete_conversation",
222
+ capability: "ai",
223
+ title: "Delete an Ask-AI conversation",
224
+ description: "Permanently deletes a conversation and its messages.",
225
+ inputSchema: { id: z.string() },
226
+ outputSchema: { ok: z.boolean() },
227
+ handler: async (input, ctx) => {
228
+ const r = await ctx.clients.cloud.deleteConversation(String(input.id));
229
+ return { text: `Deleted conversation ${input.id}.`, structured: r };
230
+ },
231
+ },
232
+ {
233
+ name: "tr_ai_usage",
234
+ capability: "ai",
235
+ title: "Ask-AI token usage",
236
+ description: "Current month's token usage vs the org's monthly budget. Use this to plan large Ask-AI workflows.",
237
+ inputSchema: {},
238
+ outputSchema: {
239
+ monthlyTokenUsage: z.number(),
240
+ monthlyTokenBudget: z.number(),
241
+ monthlyRequestCount: z.number(),
242
+ overLimit: z.boolean(),
243
+ },
244
+ handler: async (_input, ctx) => {
245
+ const r = await ctx.clients.cloud.getAiUsage();
246
+ const pct = r.monthlyTokenBudget > 0 ? ((r.monthlyTokenUsage / r.monthlyTokenBudget) * 100).toFixed(1) : "n/a";
247
+ const text = [
248
+ `## Ask-AI usage (current month)`,
249
+ ``,
250
+ `- **Used:** ${r.monthlyTokenUsage.toLocaleString()} tokens (${pct}% of budget)`,
251
+ `- **Budget:** ${r.monthlyTokenBudget.toLocaleString()} tokens`,
252
+ `- **Requests:** ${r.monthlyRequestCount}`,
253
+ `- **Over limit:** ${r.overLimit ? "yes" : "no"}`,
254
+ ].join("\n");
255
+ return { text, structured: r };
256
+ },
257
+ },
258
+ // ── Granular artifact generators ─────────────────────────────────────
259
+ artifactGenerator("tr_generate_dashboard", "generate_dashboard", "dashboard", "Generate a dashboard", "Asks the platform to produce a dashboard artifact (widget array). Input shape mirrors the platform's `generate_dashboard` tool — see `tr_ai_list_tools` for the exact schema."),
260
+ artifactGenerator("tr_generate_report", "generate_report", "report", "Generate a report", "Produces a markdown report artifact with structured sections. Input matches the platform's `generate_report` tool."),
261
+ artifactGenerator("tr_generate_test_plan", "generate_test_plan", "test_plan", "Generate a test plan", "Produces a test_plan artifact suitable for export to PDF. Input matches the platform's `generate_test_plan` tool."),
262
+ artifactGenerator("tr_generate_presentation", "generate_presentation", "presentation", "Generate a presentation", "Produces a slide-deck presentation artifact. Input matches the platform's `generate_presentation` tool."),
263
+ artifactGenerator("tr_generate_navigation_paths", "generate_navigation_paths", "navigation_paths", "Generate a navigation paths diagram", "Produces a navigation_paths artifact (journey graph). Input matches the platform's `generate_navigation_paths` tool."),
264
+ ];
265
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/ai/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from "../../registry/index.js";
2
+ export declare const appsTools: ToolDefinition[];
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/apps/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AA2B9D,eAAO,MAAM,SAAS,EAAE,cAAc,EAkHrC,CAAC"}
@@ -0,0 +1,138 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Connected Apps capability — the generic action runner for any third-party
4
+ * app the org has authorised. Slack, Notion, Linear, HubSpot, Salesforce,
5
+ * Google Calendar, etc. all flow through this surface.
6
+ *
7
+ * The underlying gateway is an implementation detail of the platform. Nothing
8
+ * in this file — names, descriptions, schema field names, error messages —
9
+ * may reference any gateway brand. The `tests/contract/branding.test.ts`
10
+ * lint enforces this at build time.
11
+ */
12
+ const AppCatalogEntry = z.object({
13
+ slug: z.string(),
14
+ name: z.string(),
15
+ category: z.string(),
16
+ connected: z.boolean(),
17
+ connectionId: z.string().nullable(),
18
+ });
19
+ const ActionEntry = z.object({
20
+ name: z.string(),
21
+ description: z.string(),
22
+ inputSchema: z.record(z.unknown()),
23
+ });
24
+ export const appsTools = [
25
+ {
26
+ name: "tr_apps_list",
27
+ capability: "apps",
28
+ title: "List connected apps",
29
+ description: "Catalog of every app the org can connect through the Apps gateway, with current connection state. Each entry has { slug, name, category, connected, connectionId }. Call this before `tr_apps_execute` to confirm the app is connected — if not, run `tr_apps_connect` first.",
30
+ inputSchema: {},
31
+ outputSchema: {
32
+ apps: z.array(AppCatalogEntry),
33
+ },
34
+ handler: async (_input, ctx) => {
35
+ const { apps } = await ctx.clients.cloud.listApps();
36
+ const lines = ["## Connected Apps", ""];
37
+ for (const a of apps) {
38
+ const dot = a.connected ? "●" : "○";
39
+ lines.push(`- ${dot} **${a.slug}** — ${a.name} (${a.category}${a.connected ? `, connection: ${a.connectionId ?? "?"}` : ""})`);
40
+ }
41
+ if (!apps.length)
42
+ lines.push("_No apps available. Check `apps.enabled` in the bootstrap response._");
43
+ return { text: lines.join("\n"), structured: { apps } };
44
+ },
45
+ },
46
+ {
47
+ name: "tr_apps_list_actions",
48
+ capability: "apps",
49
+ title: "List actions an app exposes",
50
+ description: "Returns the action catalog for one connected app. Each action has { name, description, inputSchema }. Use this before `tr_apps_execute` to discover what operations are available (e.g. send_message, create_page, create_issue).",
51
+ inputSchema: {
52
+ app: z.string().describe("App slug from `tr_apps_list`"),
53
+ },
54
+ outputSchema: {
55
+ actions: z.array(ActionEntry),
56
+ },
57
+ handler: async (input, ctx) => {
58
+ const slug = String(input.app);
59
+ const { actions } = await ctx.clients.cloud.listAppActions(slug);
60
+ const lines = [`## Actions: ${slug}`, ""];
61
+ for (const a of actions)
62
+ lines.push(`- **${a.name}** — ${a.description}`);
63
+ if (!actions.length)
64
+ lines.push("_No actions available. The app may not be connected, or the gateway returned an empty catalog._");
65
+ return { text: lines.join("\n"), structured: { actions } };
66
+ },
67
+ },
68
+ {
69
+ name: "tr_apps_connect",
70
+ capability: "apps",
71
+ title: "Connect an app",
72
+ description: "Initiates an OAuth connection for an app. Returns { redirectUrl, connectionId }. The user must open redirectUrl in a browser and complete the consent flow; the MCP cannot automate this. After consent, the connection becomes ACTIVE — poll `tr_apps_list` to confirm `connected: true`.",
73
+ inputSchema: {
74
+ app: z.string().describe("App slug to connect (from `tr_apps_list`)"),
75
+ },
76
+ outputSchema: {
77
+ redirectUrl: z.string(),
78
+ connectionId: z.string(),
79
+ },
80
+ handler: async (input, ctx) => {
81
+ const slug = String(input.app);
82
+ const result = await ctx.clients.cloud.startAppConnect(slug);
83
+ const text = [
84
+ `## Connect ${slug}`,
85
+ "",
86
+ "Open this URL in a browser and complete the consent flow:",
87
+ "",
88
+ result.redirectUrl,
89
+ "",
90
+ `After consent, this connection becomes active: \`${result.connectionId}\`. Re-run \`tr_apps_list\` to confirm.`,
91
+ ].join("\n");
92
+ return { text, structured: result };
93
+ },
94
+ },
95
+ {
96
+ name: "tr_apps_disconnect",
97
+ capability: "apps",
98
+ title: "Disconnect an app",
99
+ description: "Revokes a connection. Subsequent `tr_apps_execute` calls for the same app will fail until reconnected.",
100
+ inputSchema: {
101
+ connectionId: z.string(),
102
+ },
103
+ outputSchema: { ok: z.boolean() },
104
+ handler: async (input, ctx) => {
105
+ const id = String(input.connectionId);
106
+ const result = await ctx.clients.cloud.disconnectAppConnection(id);
107
+ return { text: `Disconnected ${id}.`, structured: result };
108
+ },
109
+ },
110
+ {
111
+ name: "tr_apps_execute",
112
+ capability: "apps",
113
+ title: "Run an action on a connected app",
114
+ description: "Universal action runner. Body: { app, action, args }. Returns { ok, app, action, result }. Examples: send a Slack message, create a Notion page, create a Linear issue, post to HubSpot CRM, create a Google Calendar event, run a Salesforce query. The platform proxies the call using credentials it holds — never pass tokens or secrets in args.",
115
+ inputSchema: {
116
+ app: z.string().describe("App slug from `tr_apps_list`"),
117
+ action: z.string().describe("Action name from `tr_apps_list_actions`"),
118
+ args: z.record(z.unknown()).describe("Action-specific arguments per the action's inputSchema"),
119
+ },
120
+ outputSchema: {
121
+ ok: z.boolean(),
122
+ app: z.string(),
123
+ action: z.string(),
124
+ result: z.record(z.unknown()),
125
+ },
126
+ handler: async (input, ctx) => {
127
+ const app = String(input.app);
128
+ const action = String(input.action);
129
+ const args = (input.args ?? {});
130
+ const result = await ctx.clients.cloud.appExecute({ app, action, args });
131
+ const text = result.ok
132
+ ? `✓ ${app}.${action} succeeded.`
133
+ : `✗ ${app}.${action} failed.`;
134
+ return { text, structured: result };
135
+ },
136
+ },
137
+ ];
138
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/apps/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from "../../registry/index.js";
2
+ export declare const artifactsTools: ToolDefinition[];
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/artifacts/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAgB9D,eAAO,MAAM,cAAc,EAAE,cAAc,EA4G1C,CAAC"}
@@ -0,0 +1,124 @@
1
+ import { z } from "zod";
2
+ import { writeFileSync, mkdirSync } from "node:fs";
3
+ import { resolve, join } from "node:path";
4
+ /**
5
+ * Artifacts capability — list, fetch, export, and save artifacts produced by
6
+ * the Ask AI agent. Artifacts live in `ai_messages.artifacts` on the platform
7
+ * and are addressable as `testrelic://artifacts/{id}` MCP resources.
8
+ */
9
+ const ArtifactRow = z.object({
10
+ id: z.string(),
11
+ type: z.string(),
12
+ title: z.string(),
13
+ createdAt: z.string(),
14
+ conversationId: z.string(),
15
+ });
16
+ export const artifactsTools = [
17
+ {
18
+ name: "tr_artifacts_list",
19
+ capability: "artifacts",
20
+ title: "List artifacts",
21
+ description: "Paginated list of artifacts. Filterable by conversationId, repoId, type (dashboard, report, test_plan, presentation, navigation_paths, session_workspace, etc.). Returns id, type, title, createdAt — fetch full payload with `tr_artifacts_get`.",
22
+ inputSchema: {
23
+ conversationId: z.string().optional(),
24
+ repoId: z.string().optional(),
25
+ type: z.string().optional(),
26
+ cursor: z.string().optional(),
27
+ limit: z.number().int().min(1).max(50).optional(),
28
+ },
29
+ outputSchema: {
30
+ artifacts: z.array(ArtifactRow),
31
+ nextCursor: z.string().nullable(),
32
+ },
33
+ handler: async (input, ctx) => {
34
+ const r = await ctx.clients.cloud.listArtifacts({
35
+ conversationId: input.conversationId,
36
+ repoId: input.repoId,
37
+ type: input.type,
38
+ cursor: input.cursor,
39
+ limit: input.limit,
40
+ });
41
+ const lines = [`## Artifacts (${r.artifacts.length})`, ""];
42
+ for (const a of r.artifacts) {
43
+ lines.push(`- **${a.id}** \`${a.type}\` — ${a.title} (conv: ${a.conversationId}, ${a.createdAt})`);
44
+ }
45
+ if (r.nextCursor)
46
+ lines.push("", `_Next cursor: \`${r.nextCursor}\`_`);
47
+ if (!r.artifacts.length)
48
+ lines.push("_No artifacts match these filters._");
49
+ return { text: lines.join("\n"), structured: r };
50
+ },
51
+ },
52
+ {
53
+ name: "tr_artifacts_get",
54
+ capability: "artifacts",
55
+ title: "Fetch one artifact",
56
+ description: "Returns the full JSON payload of one artifact. The payload shape depends on `type` — see the platform's artifact renderers for the contract.",
57
+ inputSchema: { id: z.string() },
58
+ outputSchema: {
59
+ id: z.string(),
60
+ type: z.string(),
61
+ title: z.string(),
62
+ payload: z.record(z.unknown()),
63
+ createdAt: z.string(),
64
+ },
65
+ handler: async (input, ctx) => {
66
+ const r = await ctx.clients.cloud.getArtifact(String(input.id));
67
+ const text = [
68
+ `## ${r.title} (${r.type})`,
69
+ "",
70
+ `- **id:** ${r.id}`,
71
+ `- **created:** ${r.createdAt}`,
72
+ `- **resource:** testrelic://artifacts/${r.id}`,
73
+ ].join("\n");
74
+ return { text, structured: r };
75
+ },
76
+ },
77
+ {
78
+ name: "tr_artifacts_export",
79
+ capability: "artifacts",
80
+ title: "Export artifact to PNG or PDF",
81
+ description: "Renders an artifact via the platform's headless export pipeline and returns a presigned S3 URL valid for ~1 hour. Use this for sharing or attaching to emails/PRs.",
82
+ inputSchema: {
83
+ id: z.string(),
84
+ format: z.enum(["png", "pdf"]),
85
+ },
86
+ outputSchema: { url: z.string(), expiresAt: z.string() },
87
+ handler: async (input, ctx) => {
88
+ const id = String(input.id);
89
+ const format = input.format;
90
+ const r = await ctx.clients.cloud.exportArtifact(id, format);
91
+ const text = [
92
+ `## Exported artifact ${id} → ${format.toUpperCase()}`,
93
+ "",
94
+ r.url,
95
+ "",
96
+ `_URL expires at ${r.expiresAt}._`,
97
+ ].join("\n");
98
+ return { text, structured: r };
99
+ },
100
+ },
101
+ {
102
+ name: "tr_artifacts_save_to_file",
103
+ capability: "artifacts",
104
+ title: "Save artifact JSON to local file",
105
+ description: "Fetches an artifact and writes its JSON payload to a local file under the configured `outputDir`. Returns the absolute path so a downstream tool can hand it off (e.g. open in an editor).",
106
+ inputSchema: {
107
+ id: z.string(),
108
+ filename: z.string().optional().describe("Override default filename (default: artifact-<id>.json)"),
109
+ },
110
+ outputSchema: { path: z.string(), bytes: z.number() },
111
+ handler: async (input, ctx) => {
112
+ const id = String(input.id);
113
+ const r = await ctx.clients.cloud.getArtifact(id);
114
+ const dir = resolve(ctx.config.outputDir);
115
+ mkdirSync(dir, { recursive: true });
116
+ const filename = input.filename ?? `artifact-${id}.json`;
117
+ const path = join(dir, filename);
118
+ const json = JSON.stringify(r, null, 2);
119
+ writeFileSync(path, json, "utf-8");
120
+ return { text: `Wrote ${json.length} bytes to ${path}.`, structured: { path, bytes: json.length } };
121
+ },
122
+ },
123
+ ];
124
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/artifacts/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAUtF;;;;GAIG;AACH,eAAO,MAAM,SAAS,EAAE,cAAc,EASrC,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAI/E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AActF;;;;GAIG;AACH,eAAO,MAAM,SAAS,EAAE,cAAc,EAarC,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAI/E"}
@@ -6,6 +6,10 @@ import { impactTools } from "./impact/index.js";
6
6
  import { triageTools } from "./triage/index.js";
7
7
  import { signalsTools } from "./signals/index.js";
8
8
  import { devtoolsTools } from "./devtools/index.js";
9
+ import { aiTools } from "./ai/index.js";
10
+ import { marketplaceTools } from "./marketplace/index.js";
11
+ import { appsTools } from "./apps/index.js";
12
+ import { artifactsTools } from "./artifacts/index.js";
9
13
  /**
10
14
  * Centralised tool bundle. The registry filters by capability; unknown
11
15
  * capabilities are silently dropped. Adding a new capability = append one
@@ -20,6 +24,10 @@ export const ALL_TOOLS = [
20
24
  ...triageTools,
21
25
  ...signalsTools,
22
26
  ...devtoolsTools,
27
+ ...aiTools,
28
+ ...marketplaceTools,
29
+ ...appsTools,
30
+ ...artifactsTools,
23
31
  ];
24
32
  export function registerAllTools(ctx, registry) {
25
33
  for (const tool of ALL_TOOLS) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAqB;IACzC,GAAG,SAAS;IACZ,GAAG,aAAa;IAChB,GAAG,aAAa;IAChB,GAAG,YAAY;IACf,GAAG,WAAW;IACd,GAAG,WAAW;IACd,GAAG,YAAY;IACf,GAAG,aAAa;CACjB,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,GAAgB,EAAE,QAAsB;IACvE,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAqB;IACzC,GAAG,SAAS;IACZ,GAAG,aAAa;IAChB,GAAG,aAAa;IAChB,GAAG,YAAY;IACf,GAAG,WAAW;IACd,GAAG,WAAW;IACd,GAAG,YAAY;IACf,GAAG,aAAa;IAChB,GAAG,OAAO;IACV,GAAG,gBAAgB;IACnB,GAAG,SAAS;IACZ,GAAG,cAAc;CAClB,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,GAAgB,EAAE,QAAsB;IACvE,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from "../../registry/index.js";
2
+ export declare const marketplaceTools: ToolDefinition[];
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/marketplace/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AA8B9D,eAAO,MAAM,gBAAgB,EAAE,cAAc,EA+K5C,CAAC"}