loaditout-mcp-server 0.2.1 → 0.2.3
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/dist/index.js +46 -46
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -166,27 +166,27 @@ function deleteJSON(url) {
|
|
|
166
166
|
const TOOLS = [
|
|
167
167
|
{
|
|
168
168
|
name: "search_skills",
|
|
169
|
-
description: "Search the Loaditout registry
|
|
169
|
+
description: "Search the Loaditout registry of 20,000+ AI agent skills by keyword. Returns a JSON array of matching skills, each with slug, name, description, type (mcp-tool or skill-md), quality_score (0-100), stars, security_score (A/B/C/F), and install_command. Use this for broad discovery when you do not know the exact skill slug. Do not use this if you already know the slug (use get_skill instead). Prefer smart_search over this tool for personalized results.",
|
|
170
170
|
inputSchema: {
|
|
171
171
|
type: "object",
|
|
172
172
|
properties: {
|
|
173
173
|
query: {
|
|
174
174
|
type: "string",
|
|
175
|
-
description: "Natural language search query. Examples: 'postgres database', 'browser automation', 'github issues'",
|
|
175
|
+
description: "Natural language search query describing what you need. Examples: 'postgres database', 'browser automation', 'github issues', 'stripe payments'. Keep queries short (1-4 words) for best results.",
|
|
176
176
|
},
|
|
177
177
|
type: {
|
|
178
178
|
type: "string",
|
|
179
179
|
enum: ["mcp-tool", "skill-md", "hybrid"],
|
|
180
|
-
description: "Filter
|
|
180
|
+
description: "Filter results to a specific skill type. 'mcp-tool' for structured tool servers, 'skill-md' for behavioral instruction files, 'hybrid' for both. Omit to search all types.",
|
|
181
181
|
},
|
|
182
182
|
agent: {
|
|
183
183
|
type: "string",
|
|
184
184
|
enum: ["claude-code", "cursor", "codex-cli", "windsurf"],
|
|
185
|
-
description: "Filter
|
|
185
|
+
description: "Filter results to skills compatible with a specific agent platform. Omit to search all platforms.",
|
|
186
186
|
},
|
|
187
187
|
limit: {
|
|
188
188
|
type: "number",
|
|
189
|
-
description: "
|
|
189
|
+
description: "Maximum number of results to return. Default: 10. Maximum: 25. Use a smaller limit (3-5) for quick lookups, larger (15-25) for comprehensive browsing.",
|
|
190
190
|
},
|
|
191
191
|
},
|
|
192
192
|
required: ["query"],
|
|
@@ -194,13 +194,13 @@ const TOOLS = [
|
|
|
194
194
|
},
|
|
195
195
|
{
|
|
196
196
|
name: "get_skill",
|
|
197
|
-
description: "Get
|
|
197
|
+
description: "Get comprehensive details for a specific skill by its slug. Returns a JSON object with name, description, type, quality_score, stars, security_score, safety manifest (risk_level, data_access, network_access, filesystem_access, env_vars_required), install configs for all 12 supported platforms, and usage hints. Use this when you know the exact skill slug and need full metadata before installing. Do not use this for discovery (use search_skills or recommend_skills instead).",
|
|
198
198
|
inputSchema: {
|
|
199
199
|
type: "object",
|
|
200
200
|
properties: {
|
|
201
201
|
slug: {
|
|
202
202
|
type: "string",
|
|
203
|
-
description: "Skill slug in owner/repo format.
|
|
203
|
+
description: "Skill slug in owner/repo format. The owner is the GitHub username or organization, and repo is the repository name. Examples: 'supabase/mcp', 'microsoft/playwright-mcp', 'anthropics/skills'. Use search_skills to find valid slugs if you do not know the exact one.",
|
|
204
204
|
},
|
|
205
205
|
},
|
|
206
206
|
required: ["slug"],
|
|
@@ -208,18 +208,18 @@ const TOOLS = [
|
|
|
208
208
|
},
|
|
209
209
|
{
|
|
210
210
|
name: "install_skill",
|
|
211
|
-
description: "Get the
|
|
211
|
+
description: "Get the platform-specific configuration JSON needed to install a single skill. Returns a JSON object with config_path (where to write the config), config (the JSON to write), and instructions (human-readable setup steps). This tool is read-only and does NOT write any files. Use this when the user wants to install a specific skill and you need the exact config for their agent platform. Do not use this for batch installs (use install_batch instead) or for packs (use install_pack instead). The skill slug is automatically saved to agent memory after calling this tool.",
|
|
212
212
|
inputSchema: {
|
|
213
213
|
type: "object",
|
|
214
214
|
properties: {
|
|
215
215
|
slug: {
|
|
216
216
|
type: "string",
|
|
217
|
-
description: "Skill slug in owner/repo format",
|
|
217
|
+
description: "Skill slug in owner/repo format. Examples: 'supabase/mcp', 'microsoft/playwright-mcp'. Must be a valid slug from the Loaditout registry.",
|
|
218
218
|
},
|
|
219
219
|
agent: {
|
|
220
220
|
type: "string",
|
|
221
221
|
enum: ["claude-code", "cursor", "codex-cli", "windsurf", "generic"],
|
|
222
|
-
description: "
|
|
222
|
+
description: "The target agent platform. Determines the config file format and path. Use 'claude-code' for Claude Code (.claude/settings.json), 'cursor' for Cursor (.cursor/mcp.json), 'generic' if the platform is unknown.",
|
|
223
223
|
},
|
|
224
224
|
},
|
|
225
225
|
required: ["slug", "agent"],
|
|
@@ -227,7 +227,7 @@ const TOOLS = [
|
|
|
227
227
|
},
|
|
228
228
|
{
|
|
229
229
|
name: "list_categories",
|
|
230
|
-
description: "List all skill categories in the Loaditout registry
|
|
230
|
+
description: "List all 10 skill categories in the Loaditout registry. Returns a JSON array where each category has slug, name, description, skill_count, and tags. Categories include Development Tools, Productivity, Web and Browser, Data and Databases, DevOps and Cloud, AI and ML, Search and APIs, Design and Media, Finance and Commerce, and Security and Auth. Use this to help the user browse skills by domain when they do not have a specific search query. No parameters required.",
|
|
231
231
|
inputSchema: {
|
|
232
232
|
type: "object",
|
|
233
233
|
properties: {},
|
|
@@ -235,17 +235,17 @@ const TOOLS = [
|
|
|
235
235
|
},
|
|
236
236
|
{
|
|
237
237
|
name: "recommend_skills",
|
|
238
|
-
description: "Get skill recommendations based on
|
|
238
|
+
description: "Get personalized skill recommendations based on a project description. Returns a JSON array of 5 suggested skills ranked by relevance, each with slug, name, description, quality_score, stars, tags, and install_command. Use this when starting a new project to discover relevant tools, or when you need capabilities beyond your current toolset. Do not use this for searching by keyword (use search_skills instead). Requires a descriptive context string for accurate recommendations.",
|
|
239
239
|
inputSchema: {
|
|
240
240
|
type: "object",
|
|
241
241
|
properties: {
|
|
242
242
|
context: {
|
|
243
243
|
type: "string",
|
|
244
|
-
description: "
|
|
244
|
+
description: "A description of what you are building or working on. Be specific about technologies, frameworks, and goals. Examples: 'building a Next.js app with Supabase and Stripe', 'setting up CI/CD for a Python monorepo', 'automating browser testing for an e-commerce site'. Longer, more specific descriptions produce better recommendations.",
|
|
245
245
|
},
|
|
246
246
|
installed: {
|
|
247
247
|
type: "string",
|
|
248
|
-
description: "Comma-separated
|
|
248
|
+
description: "Comma-separated list of skill slugs already installed, to exclude from recommendations. Format: 'owner1/repo1,owner2/repo2'. Example: 'supabase/mcp,microsoft/playwright-mcp'. Omit if no skills are installed yet.",
|
|
249
249
|
},
|
|
250
250
|
},
|
|
251
251
|
required: ["context"],
|
|
@@ -253,23 +253,23 @@ const TOOLS = [
|
|
|
253
253
|
},
|
|
254
254
|
{
|
|
255
255
|
name: "check_capability_gap",
|
|
256
|
-
description: "Analyze
|
|
256
|
+
description: "Analyze a task the agent cannot complete and suggest skills that would fill the gap. Returns a JSON array of 5 recommended skills ranked by relevance to the task, each with slug, name, description, quality_score, and install_command. Use this when you encounter a task that requires capabilities you do not have (e.g., database access, browser automation, file conversion). Do not use this for general browsing (use list_categories instead) or when you already know what skill you need (use search_skills instead).",
|
|
257
257
|
inputSchema: {
|
|
258
258
|
type: "object",
|
|
259
259
|
properties: {
|
|
260
260
|
task: {
|
|
261
261
|
type: "string",
|
|
262
|
-
description: "
|
|
262
|
+
description: "A specific description of the task you cannot complete. Examples: 'query a PostgreSQL database to check user records', 'take a screenshot of a webpage and analyze the layout', 'deploy a Docker container to AWS ECS'. Be specific about the action and target.",
|
|
263
263
|
},
|
|
264
264
|
current_tools: {
|
|
265
265
|
type: "array",
|
|
266
266
|
items: { type: "string" },
|
|
267
|
-
description: "
|
|
267
|
+
description: "List of tool names or skill slugs the agent currently has access to. This helps avoid recommending tools you already have. Pass an empty array [] if no tools are installed. Examples: ['supabase/mcp', 'microsoft/playwright-mcp'].",
|
|
268
268
|
},
|
|
269
269
|
agent_type: {
|
|
270
270
|
type: "string",
|
|
271
271
|
enum: ["claude-code", "cursor", "codex-cli", "windsurf"],
|
|
272
|
-
description: "The agent platform
|
|
272
|
+
description: "The agent platform you are running on. Ensures recommended skills are compatible with your platform.",
|
|
273
273
|
},
|
|
274
274
|
},
|
|
275
275
|
required: ["task", "current_tools", "agent_type"],
|
|
@@ -277,22 +277,22 @@ const TOOLS = [
|
|
|
277
277
|
},
|
|
278
278
|
{
|
|
279
279
|
name: "report_skill_usage",
|
|
280
|
-
description: "Report
|
|
280
|
+
description: "Report the outcome of using a skill, generating a verifiable execution proof. Returns a JSON object with proof_id, verify_url, and shareable_text. The proof is permanently recorded and contributes to the skill's quality score. Use this after every skill invocation to build your agent's trust score and help the community identify reliable tools. Do not call this before actually using the skill. Requires the skill slug and a status indicating the outcome.",
|
|
281
281
|
inputSchema: {
|
|
282
282
|
type: "object",
|
|
283
283
|
properties: {
|
|
284
284
|
slug: {
|
|
285
285
|
type: "string",
|
|
286
|
-
description: "
|
|
286
|
+
description: "The slug of the skill you used, in owner/repo format. Examples: 'supabase/mcp', 'microsoft/playwright-mcp'. Must match a skill that exists in the Loaditout registry.",
|
|
287
287
|
},
|
|
288
288
|
status: {
|
|
289
289
|
type: "string",
|
|
290
290
|
enum: ["success", "error", "partial"],
|
|
291
|
-
description: "
|
|
291
|
+
description: "The outcome of using the skill. 'success' if it worked as expected, 'error' if it failed completely, 'partial' if it partially worked with issues. Be honest, as this affects community quality scores.",
|
|
292
292
|
},
|
|
293
293
|
error_message: {
|
|
294
294
|
type: "string",
|
|
295
|
-
description: "
|
|
295
|
+
description: "Details about what went wrong. Required when status is 'error' or 'partial'. Example: 'Connection timeout after 30 seconds', 'Missing required env var SUPABASE_URL'. Omit when status is 'success'.",
|
|
296
296
|
},
|
|
297
297
|
},
|
|
298
298
|
required: ["slug", "status"],
|
|
@@ -300,7 +300,7 @@ const TOOLS = [
|
|
|
300
300
|
},
|
|
301
301
|
{
|
|
302
302
|
name: "list_my_proofs",
|
|
303
|
-
description: "List all execution proofs
|
|
303
|
+
description: "List all execution proofs created by this agent. Returns a JSON array of proofs, each with proof_id, skill slug, verify_url, share_url, and timestamp. Proofs serve as a verifiable record of skill usage, like an agent resume. Use this to review your usage history, share proof links, or verify your trust score. No parameters required. Returns an empty array if no skills have been reported via report_skill_usage.",
|
|
304
304
|
inputSchema: {
|
|
305
305
|
type: "object",
|
|
306
306
|
properties: {},
|
|
@@ -308,13 +308,13 @@ const TOOLS = [
|
|
|
308
308
|
},
|
|
309
309
|
{
|
|
310
310
|
name: "verify_proof",
|
|
311
|
-
description: "Verify an execution proof by its
|
|
311
|
+
description: "Verify the authenticity and validity of an execution proof by its ID. Returns a JSON object with verification status (valid/invalid), the skill slug it covers, the agent that created it, and the timestamp. Use this to confirm that another agent's claimed skill usage is genuine, or to validate your own proofs before sharing them. Do not use this for listing proofs (use list_my_proofs instead).",
|
|
312
312
|
inputSchema: {
|
|
313
313
|
type: "object",
|
|
314
314
|
properties: {
|
|
315
315
|
proof_id: {
|
|
316
316
|
type: "string",
|
|
317
|
-
description: "The proof
|
|
317
|
+
description: "The unique proof identifier to verify. Format: 'lp_' followed by 16 hex characters. Example: 'lp_a1b2c3d4e5f6g7h8'. Obtain proof IDs from report_skill_usage responses or list_my_proofs results.",
|
|
318
318
|
},
|
|
319
319
|
},
|
|
320
320
|
required: ["proof_id"],
|
|
@@ -322,7 +322,7 @@ const TOOLS = [
|
|
|
322
322
|
},
|
|
323
323
|
{
|
|
324
324
|
name: "save_memory",
|
|
325
|
-
description: "Save a key-value pair to persistent agent memory
|
|
325
|
+
description: "Save a key-value pair to persistent agent memory that survives across sessions. Returns a confirmation with the stored key. Use this to remember installed skills, user preferences, project context, or recent search queries. Call this proactively whenever you learn something worth remembering. Do not store sensitive data like passwords or API keys. Retrieve saved memories with recall_memory.",
|
|
326
326
|
inputSchema: {
|
|
327
327
|
type: "object",
|
|
328
328
|
properties: {
|
|
@@ -344,7 +344,7 @@ const TOOLS = [
|
|
|
344
344
|
},
|
|
345
345
|
{
|
|
346
346
|
name: "recall_memory",
|
|
347
|
-
description: "Retrieve previously saved memories. Returns
|
|
347
|
+
description: "Retrieve previously saved memories from persistent storage. Returns a JSON object with a memories array, each entry containing key, value, and type. Use this at the start of every session to restore context, installed skills, and user preferences. Returns an empty array if no memories exist. Filter by type to retrieve only specific categories of memories.",
|
|
348
348
|
inputSchema: {
|
|
349
349
|
type: "object",
|
|
350
350
|
properties: {
|
|
@@ -358,7 +358,7 @@ const TOOLS = [
|
|
|
358
358
|
},
|
|
359
359
|
{
|
|
360
360
|
name: "request_permission",
|
|
361
|
-
description: "Request permission from the human owner
|
|
361
|
+
description: "Request explicit permission from the human owner before installing a skill. Returns a JSON object with request_id (number) and status ('pending'). Use this for skills with security grade C or F, high risk_level, or when the skill requires sensitive permissions (filesystem, network, credentials). Check the request status later with check_permission. Do not use this for A-graded skills unless the user has requested manual approval for all installs.",
|
|
362
362
|
inputSchema: {
|
|
363
363
|
type: "object",
|
|
364
364
|
properties: {
|
|
@@ -376,7 +376,7 @@ const TOOLS = [
|
|
|
376
376
|
},
|
|
377
377
|
{
|
|
378
378
|
name: "check_permission",
|
|
379
|
-
description: "Check the status of a previously submitted permission request. Returns 'pending', 'approved', or 'denied'.",
|
|
379
|
+
description: "Check the status of a previously submitted permission request. Returns a JSON object with status ('pending', 'approved', or 'denied'). Use this after calling request_permission to poll for the human owner's decision. Do not call this without a valid request_id from a prior request_permission call.",
|
|
380
380
|
inputSchema: {
|
|
381
381
|
type: "object",
|
|
382
382
|
properties: {
|
|
@@ -390,7 +390,7 @@ const TOOLS = [
|
|
|
390
390
|
},
|
|
391
391
|
{
|
|
392
392
|
name: "install_batch",
|
|
393
|
-
description: "Install multiple skills
|
|
393
|
+
description: "Install multiple specific skills in a single call. Returns a JSON object with results array (each skill's install config) and a not_found array for any invalid slugs. Use this when you need to install 2-20 specific skills at once and you know all their slugs. Do not use this for curated collections (use install_pack instead). Maximum 20 skills per call.",
|
|
394
394
|
inputSchema: {
|
|
395
395
|
type: "object",
|
|
396
396
|
properties: {
|
|
@@ -410,7 +410,7 @@ const TOOLS = [
|
|
|
410
410
|
},
|
|
411
411
|
{
|
|
412
412
|
name: "share_loadout",
|
|
413
|
-
description: "Get this agent's public
|
|
413
|
+
description: "Get this agent's public profile including installed skills, trust score, usage stats, and profile URL. Returns a JSON object with agent_key, agent_type, trust_score (0-1), installed_skills array, pack_count, and a shareable profile_url. Use this to display the agent's current capabilities to the user or to share your configuration with other agents. No parameters required.",
|
|
414
414
|
inputSchema: {
|
|
415
415
|
type: "object",
|
|
416
416
|
properties: {},
|
|
@@ -418,7 +418,7 @@ const TOOLS = [
|
|
|
418
418
|
},
|
|
419
419
|
{
|
|
420
420
|
name: "install_pack",
|
|
421
|
-
description: "Install
|
|
421
|
+
description: "Install all skills from a curated Agent Pack in a single call. Returns a formatted text response listing each skill in the pack with its name, type, slug, and platform-specific install config. Packs are pre-built collections for specific workflows (e.g., 'research-agent' has browser, search, and memory tools). Use this instead of installing skills individually when setting up for a specific role. Do not use this if you only need one specific skill (use install_skill instead).",
|
|
422
422
|
inputSchema: {
|
|
423
423
|
type: "object",
|
|
424
424
|
properties: {
|
|
@@ -437,21 +437,21 @@ const TOOLS = [
|
|
|
437
437
|
},
|
|
438
438
|
{
|
|
439
439
|
name: "validate_action",
|
|
440
|
-
description: "
|
|
440
|
+
description: "Pre-flight safety check before executing an action on a skill. Returns a validation result with safe_to_proceed (boolean), risk_level, security_grade, warnings array, and whether the skill is verified. Checks the skill's security grade, safety manifest, parameter injection patterns, and how recently it was updated. Use this before calling any skill action that could have side effects (writes, deletes, network requests). Do not skip this step for skills with security grade C or F.",
|
|
441
441
|
inputSchema: {
|
|
442
442
|
type: "object",
|
|
443
443
|
properties: {
|
|
444
444
|
slug: {
|
|
445
445
|
type: "string",
|
|
446
|
-
description: "Skill slug in owner/repo format.
|
|
446
|
+
description: "Skill slug in owner/repo format. Examples: 'supabase/mcp', 'microsoft/playwright-mcp'. Must be a valid slug from the registry.",
|
|
447
447
|
},
|
|
448
448
|
action: {
|
|
449
449
|
type: "string",
|
|
450
|
-
description: "The action about to be performed.
|
|
450
|
+
description: "The specific action about to be performed on the skill. Examples: 'query_database', 'write_file', 'send_email', 'delete_record'. Use the actual tool/action name the skill provides.",
|
|
451
451
|
},
|
|
452
452
|
parameters: {
|
|
453
453
|
type: "object",
|
|
454
|
-
description: "
|
|
454
|
+
description: "The parameters that will be passed to the action. These are scanned for prompt injection patterns. Pass the exact parameters you intend to use. Omit if the action takes no parameters.",
|
|
455
455
|
},
|
|
456
456
|
},
|
|
457
457
|
required: ["slug", "action"],
|
|
@@ -459,7 +459,7 @@ const TOOLS = [
|
|
|
459
459
|
},
|
|
460
460
|
{
|
|
461
461
|
name: "flag_skill",
|
|
462
|
-
description: "Report a skill that
|
|
462
|
+
description: "Report a problematic skill to the Loaditout moderation team. Returns a confirmation that the flag was recorded. Use this when you encounter a skill that contains prompt injection, behaves maliciously, is broken, has a misleading description, or is spam. Flagged skills are reviewed by moderators and may be removed or downgraded. Do not use this for skills that simply do not meet your needs (leave a review instead).",
|
|
463
463
|
inputSchema: {
|
|
464
464
|
type: "object",
|
|
465
465
|
properties: {
|
|
@@ -489,7 +489,7 @@ const TOOLS = [
|
|
|
489
489
|
},
|
|
490
490
|
{
|
|
491
491
|
name: "review_skill",
|
|
492
|
-
description: "Leave a
|
|
492
|
+
description: "Leave a rating and optional comment for a skill you have used. Returns a confirmation that the review was recorded. Reviews help other agents and humans decide whether to install a skill. Use this after using a skill to share your experience. Do not review skills you have not actually used. Ratings range from 1 (unusable) to 5 (excellent).",
|
|
493
493
|
inputSchema: {
|
|
494
494
|
type: "object",
|
|
495
495
|
properties: {
|
|
@@ -511,7 +511,7 @@ const TOOLS = [
|
|
|
511
511
|
},
|
|
512
512
|
{
|
|
513
513
|
name: "set_profile",
|
|
514
|
-
description: "Set your agent's public profile display name and bio.
|
|
514
|
+
description: "Set or update your agent's public profile display name and bio. Returns a confirmation of the update. The profile appears on your public page at loaditout.ai/agents/{agent_key}. Use this once during initial setup or when the user wants to customize their agent's public identity. Both fields are optional, so you can update just the name or just the bio.",
|
|
515
515
|
inputSchema: {
|
|
516
516
|
type: "object",
|
|
517
517
|
properties: {
|
|
@@ -528,17 +528,17 @@ const TOOLS = [
|
|
|
528
528
|
},
|
|
529
529
|
{
|
|
530
530
|
name: "smart_search",
|
|
531
|
-
description: "
|
|
531
|
+
description: "Personalized skill search that automatically excludes already-installed skills and applies your preferences. Returns a JSON object with results array (each skill has slug, name, description, type, quality_score, stars, security_score, install_command), total count, and personalization metadata showing how many installed skills were excluded. This is the preferred search tool for most use cases. Use search_skills only when you need unfiltered results or specific type/agent filters.",
|
|
532
532
|
inputSchema: {
|
|
533
533
|
type: "object",
|
|
534
534
|
properties: {
|
|
535
535
|
query: {
|
|
536
536
|
type: "string",
|
|
537
|
-
description: "Natural language search query. Examples: 'postgres database', 'browser automation', 'github issues'",
|
|
537
|
+
description: "Natural language search query describing what you need. Examples: 'postgres database', 'browser automation', 'github issues', 'stripe payments'. Keep queries to 1-4 words for best results.",
|
|
538
538
|
},
|
|
539
539
|
limit: {
|
|
540
540
|
type: "number",
|
|
541
|
-
description: "
|
|
541
|
+
description: "Maximum number of results to return. Default: 10. Maximum: 25. Use 3-5 for quick lookups, 15-25 for comprehensive browsing.",
|
|
542
542
|
},
|
|
543
543
|
},
|
|
544
544
|
required: ["query"],
|
|
@@ -628,12 +628,12 @@ async function handleSearchSkills(args) {
|
|
|
628
628
|
return JSON.stringify(parsed, null, 2);
|
|
629
629
|
}
|
|
630
630
|
async function handleGetSkill(args) {
|
|
631
|
-
const result = await fetchJSON(`${API_BASE}/skill/${
|
|
631
|
+
const result = await fetchJSON(`${API_BASE}/skill/${args.slug.split("/").map(encodeURIComponent).join("/")}`);
|
|
632
632
|
return JSON.stringify(result, null, 2);
|
|
633
633
|
}
|
|
634
634
|
async function handleInstallSkill(args) {
|
|
635
635
|
const params = new URLSearchParams({ agent: args.agent });
|
|
636
|
-
const result = await fetchJSON(`${API_BASE}/install/${
|
|
636
|
+
const result = await fetchJSON(`${API_BASE}/install/${args.slug.split("/").map(encodeURIComponent).join("/")}?${params.toString()}`, { "X-Agent-Key": AGENT_KEY });
|
|
637
637
|
// Fire-and-forget: save this slug to installed_skills memory
|
|
638
638
|
const memories = await loadAgentMemory().catch(() => []);
|
|
639
639
|
const existing = extractInstalledSlugs(memories);
|
|
@@ -831,7 +831,7 @@ async function handleSetProfile(args) {
|
|
|
831
831
|
}
|
|
832
832
|
async function handleInstallPack(args) {
|
|
833
833
|
const params = new URLSearchParams({ agent: args.agent });
|
|
834
|
-
const result = (await fetchJSON(`${API_BASE}/pack/${
|
|
834
|
+
const result = (await fetchJSON(`${API_BASE}/pack/${args.slug.split("/").map(encodeURIComponent).join("/")}?${params.toString()}`));
|
|
835
835
|
if (result.error) {
|
|
836
836
|
return `Pack not found: ${result.error}`;
|
|
837
837
|
}
|
|
@@ -893,7 +893,7 @@ async function handleFlagSkill(args) {
|
|
|
893
893
|
if (args.details) {
|
|
894
894
|
body.details = args.details;
|
|
895
895
|
}
|
|
896
|
-
const url = `https://loaditout.ai/api/skills/${
|
|
896
|
+
const url = `https://www.loaditout.ai/api/skills/${args.slug.split("/").map(encodeURIComponent).join("/")}/flag`;
|
|
897
897
|
const result = (await postJSON(url, body, { "X-Agent-Key": AGENT_KEY }));
|
|
898
898
|
if (result.error) {
|
|
899
899
|
return `Flag failed: ${result.error}`;
|