@doxhub/mcp-server 0.2.0 → 0.2.2

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 (62) hide show
  1. package/dist/api-client.d.ts.map +1 -1
  2. package/dist/api-client.js +78 -36
  3. package/dist/api-client.js.map +1 -1
  4. package/dist/auth/mcp-token-verify.d.ts.map +1 -1
  5. package/dist/auth/mcp-token-verify.js +8 -0
  6. package/dist/auth/mcp-token-verify.js.map +1 -1
  7. package/dist/cli/list-agents.d.ts +2 -0
  8. package/dist/cli/list-agents.d.ts.map +1 -0
  9. package/dist/cli/list-agents.js +61 -0
  10. package/dist/cli/list-agents.js.map +1 -0
  11. package/dist/cli/list-projects.d.ts.map +1 -1
  12. package/dist/cli/list-projects.js +16 -6
  13. package/dist/cli/list-projects.js.map +1 -1
  14. package/dist/cli/list-skills.d.ts +2 -0
  15. package/dist/cli/list-skills.d.ts.map +1 -0
  16. package/dist/cli/list-skills.js +61 -0
  17. package/dist/cli/list-skills.js.map +1 -0
  18. package/dist/cli/list-workflows.d.ts +2 -0
  19. package/dist/cli/list-workflows.d.ts.map +1 -0
  20. package/dist/cli/list-workflows.js +45 -0
  21. package/dist/cli/list-workflows.js.map +1 -0
  22. package/dist/cli/list-workspaces.d.ts.map +1 -1
  23. package/dist/cli/list-workspaces.js +12 -5
  24. package/dist/cli/list-workspaces.js.map +1 -1
  25. package/dist/cli/load-workflow.d.ts +6 -0
  26. package/dist/cli/load-workflow.d.ts.map +1 -0
  27. package/dist/cli/load-workflow.js +92 -0
  28. package/dist/cli/load-workflow.js.map +1 -0
  29. package/dist/cli/setup.js +3 -0
  30. package/dist/cli/setup.js.map +1 -1
  31. package/dist/index.js +44 -1
  32. package/dist/index.js.map +1 -1
  33. package/dist/server.d.ts.map +1 -1
  34. package/dist/server.js +12 -0
  35. package/dist/server.js.map +1 -1
  36. package/dist/tools/index.d.ts +4 -0
  37. package/dist/tools/index.d.ts.map +1 -1
  38. package/dist/tools/index.js +4 -0
  39. package/dist/tools/index.js.map +1 -1
  40. package/dist/tools/list-agents.d.ts +19 -0
  41. package/dist/tools/list-agents.d.ts.map +1 -0
  42. package/dist/tools/list-agents.js +75 -0
  43. package/dist/tools/list-agents.js.map +1 -0
  44. package/dist/tools/list-projects.d.ts.map +1 -1
  45. package/dist/tools/list-projects.js +9 -2
  46. package/dist/tools/list-projects.js.map +1 -1
  47. package/dist/tools/list-skills.d.ts +19 -0
  48. package/dist/tools/list-skills.d.ts.map +1 -0
  49. package/dist/tools/list-skills.js +75 -0
  50. package/dist/tools/list-skills.js.map +1 -0
  51. package/dist/tools/list-workflows.d.ts +21 -0
  52. package/dist/tools/list-workflows.d.ts.map +1 -0
  53. package/dist/tools/list-workflows.js +73 -0
  54. package/dist/tools/list-workflows.js.map +1 -0
  55. package/dist/tools/list-workspaces.d.ts.map +1 -1
  56. package/dist/tools/list-workspaces.js +7 -2
  57. package/dist/tools/list-workspaces.js.map +1 -1
  58. package/dist/tools/load-workflow.d.ts +26 -0
  59. package/dist/tools/load-workflow.d.ts.map +1 -0
  60. package/dist/tools/load-workflow.js +87 -0
  61. package/dist/tools/load-workflow.js.map +1 -0
  62. package/package.json +1 -1
@@ -0,0 +1,75 @@
1
+ import { getApiClient } from '../api-client.js';
2
+ export const listSkillsTool = {
3
+ name: 'list_skills',
4
+ description: 'Lists all skills (shared knowledge and best practices) in a workspace. Skills contain reusable documentation for AI agents.',
5
+ inputSchema: {
6
+ type: 'object',
7
+ properties: {
8
+ workspaceId: {
9
+ type: 'string',
10
+ description: 'Workspace ID. If not provided, uses your default workspace.',
11
+ },
12
+ },
13
+ },
14
+ };
15
+ export async function listSkills(auth, args) {
16
+ const apiClient = getApiClient();
17
+ const workspaceId = args.workspaceId || auth.workspaceId;
18
+ if (!workspaceId) {
19
+ return {
20
+ content: [
21
+ {
22
+ type: 'text',
23
+ text: 'No workspace specified. Please provide a workspaceId or select a default workspace.',
24
+ },
25
+ ],
26
+ };
27
+ }
28
+ try {
29
+ const allProjects = await apiClient.getProjects(workspaceId);
30
+ // Filter for skills (system projects with systemType='skills')
31
+ const skills = allProjects.filter((p) => p.isSystem && p.systemType === 'skills');
32
+ if (!skills || skills.length === 0) {
33
+ return {
34
+ content: [
35
+ {
36
+ type: 'text',
37
+ text: 'No skills found in this workspace. Skills are shared knowledge and best practices for AI agents.',
38
+ },
39
+ ],
40
+ };
41
+ }
42
+ // Format as a clean summary
43
+ let output = `📚 Skills in Workspace (${skills.length} total)\n\n`;
44
+ skills.forEach((skill, index) => {
45
+ output += `${index + 1}. **${skill.name}**\n`;
46
+ output += ` ID: ${skill.id}\n`;
47
+ output += ` Files: ${skill.fileCount || 0} skill file${skill.fileCount !== 1 ? 's' : ''}\n`;
48
+ if (skill.description) {
49
+ output += ` Description: ${skill.description}\n`;
50
+ }
51
+ output += '\n';
52
+ });
53
+ output += `💡 Use list_files with a skill ID to see skill documentation.`;
54
+ return {
55
+ content: [
56
+ {
57
+ type: 'text',
58
+ text: output,
59
+ },
60
+ ],
61
+ };
62
+ }
63
+ catch (error) {
64
+ return {
65
+ content: [
66
+ {
67
+ type: 'text',
68
+ text: `Error listing skills: ${error instanceof Error ? error.message : 'Unknown error'}`,
69
+ },
70
+ ],
71
+ isError: true,
72
+ };
73
+ }
74
+ }
75
+ //# sourceMappingURL=list-skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-skills.js","sourceRoot":"","sources":["../../src/tools/list-skills.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,CAAC,MAAM,cAAc,GAAS;IAClC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,6HAA6H;IAC1I,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,6DAA6D;aAC3E;SACF;KACF;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAiB,EAAE,IAA8B;IAChF,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC;IAEzD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,qFAAqF;iBAC5F;aACF;SACF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAE7D,+DAA+D;QAC/D,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC;QAEvF,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,kGAAkG;qBACzG;iBACF;aACF,CAAC;QACJ,CAAC;QAED,4BAA4B;QAC5B,IAAI,MAAM,GAAG,2BAA2B,MAAM,CAAC,MAAM,aAAa,CAAC;QAEnE,MAAM,CAAC,OAAO,CAAC,CAAC,KAAU,EAAE,KAAa,EAAE,EAAE;YAC3C,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,MAAM,CAAC;YAC9C,MAAM,IAAI,UAAU,KAAK,CAAC,EAAE,IAAI,CAAC;YACjC,MAAM,IAAI,aAAa,KAAK,CAAC,SAAS,IAAI,CAAC,cAAc,KAAK,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;YAC9F,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;gBACtB,MAAM,IAAI,mBAAmB,KAAK,CAAC,WAAW,IAAI,CAAC;YACrD,CAAC;YACD,MAAM,IAAI,IAAI,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,+DAA+D,CAAC;QAE1E,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,MAAM;iBACb;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,yBAAyB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE;iBAC1F;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { AuthContext } from '../types.js';
2
+ export declare const listWorkflowsTool: {
3
+ name: string;
4
+ description: string;
5
+ inputSchema: {
6
+ type: string;
7
+ properties: {
8
+ workspaceId: {
9
+ type: string;
10
+ description: string;
11
+ };
12
+ };
13
+ };
14
+ };
15
+ export declare function listWorkflows(_auth: AuthContext, args: any): Promise<{
16
+ content: {
17
+ type: string;
18
+ text: string;
19
+ }[];
20
+ }>;
21
+ //# sourceMappingURL=list-workflows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-workflows.d.ts","sourceRoot":"","sources":["../../src/tools/list-workflows.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI/C,eAAO,MAAM,iBAAiB;;;;;;;;;;;;CAa7B,CAAC;AAEF,wBAAsB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG;;;;;GAyEhE"}
@@ -0,0 +1,73 @@
1
+ import { DoxHubApiClient } from '../api-client.js';
2
+ import { getCurrentProfile } from '../cli/credentials.js';
3
+ export const listWorkflowsTool = {
4
+ name: 'list_workflows',
5
+ description: 'List all workflows in a workspace. Workflows are named collections of tags that load multiple resources at once. Returns workflow names, descriptions, and tag counts.',
6
+ inputSchema: {
7
+ type: 'object',
8
+ properties: {
9
+ workspaceId: {
10
+ type: 'string',
11
+ description: 'Optional: workspace ID to list workflows from (uses default if not specified)',
12
+ },
13
+ },
14
+ },
15
+ };
16
+ export async function listWorkflows(_auth, args) {
17
+ const { workspaceId } = args || {};
18
+ const profile = getCurrentProfile();
19
+ if (!profile || !profile.accessToken) {
20
+ throw new Error('Not authenticated');
21
+ }
22
+ const client = new DoxHubApiClient(profile.apiUrl || 'https://api.doxhub.io/api/v1', profile.accessToken);
23
+ // Determine workspace ID
24
+ let targetWorkspaceId = workspaceId;
25
+ if (!targetWorkspaceId) {
26
+ // Get user's workspaces
27
+ const workspacesResponse = await client.get('/workspaces');
28
+ const workspaces = workspacesResponse.data || [];
29
+ if (workspaces.length === 0) {
30
+ throw new Error('No workspaces found');
31
+ }
32
+ targetWorkspaceId = workspaces[0].id;
33
+ }
34
+ // Fetch workflows
35
+ const response = await client.get(`/workspaces/${targetWorkspaceId}/workflows`);
36
+ const workflows = response.data || [];
37
+ if (workflows.length === 0) {
38
+ return {
39
+ content: [
40
+ {
41
+ type: 'text',
42
+ text: JSON.stringify({
43
+ message: 'No workflows found in this workspace',
44
+ workspaceId: targetWorkspaceId,
45
+ workflows: [],
46
+ }, null, 2),
47
+ },
48
+ ],
49
+ };
50
+ }
51
+ // Format workflows for display
52
+ const formattedWorkflows = workflows.map((w) => ({
53
+ id: w.id,
54
+ name: w.name,
55
+ description: w.description || null,
56
+ tagCount: w.tagCount || 0,
57
+ createdAt: w.createdAt,
58
+ updatedAt: w.updatedAt,
59
+ }));
60
+ return {
61
+ content: [
62
+ {
63
+ type: 'text',
64
+ text: JSON.stringify({
65
+ message: `Found ${workflows.length} workflow(s) in workspace`,
66
+ workspaceId: targetWorkspaceId,
67
+ workflows: formattedWorkflows,
68
+ }, null, 2),
69
+ },
70
+ ],
71
+ };
72
+ }
73
+ //# sourceMappingURL=list-workflows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-workflows.js","sourceRoot":"","sources":["../../src/tools/list-workflows.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,gBAAgB;IACtB,WAAW,EACT,wKAAwK;IAC1K,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,+EAA+E;aAC7F;SACF;KACF;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAkB,EAAE,IAAS;IAC/D,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;IAEnC,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;IACpC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,MAAM,IAAI,8BAA8B,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAE1G,yBAAyB;IACzB,IAAI,iBAAiB,GAAG,WAAW,CAAC;IACpC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,wBAAwB;QACxB,MAAM,kBAAkB,GAAG,MAAM,MAAM,CAAC,GAAG,CAAgD,aAAa,CAAC,CAAC;QAC1G,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,IAAI,EAAE,CAAC;QAEjD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC;QAED,iBAAiB,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC;IACxC,CAAC;IAED,kBAAkB;IAClB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAkB,eAAe,iBAAiB,YAAY,CAAC,CAAC;IACjG,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;IAEtC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;wBACE,OAAO,EAAE,sCAAsC;wBAC/C,WAAW,EAAE,iBAAiB;wBAC9B,SAAS,EAAE,EAAE;qBACd,EACD,IAAI,EACJ,CAAC,CACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC;IAED,+BAA+B;IAC/B,MAAM,kBAAkB,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/C,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,IAAI;QAClC,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,CAAC;QACzB,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,SAAS,EAAE,CAAC,CAAC,SAAS;KACvB,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;oBACE,OAAO,EAAE,SAAS,SAAS,CAAC,MAAM,2BAA2B;oBAC7D,WAAW,EAAE,iBAAiB;oBAC9B,SAAS,EAAE,kBAAkB;iBAC9B,EACD,IAAI,EACJ,CAAC,CACF;aACF;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"list-workspaces.d.ts","sourceRoot":"","sources":["../../src/tools/list-workspaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,eAAO,MAAM,kBAAkB;;;;;;;;CAS9B,CAAC;AAEF,wBAAsB,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG;;;;;GAuCjE"}
1
+ {"version":3,"file":"list-workspaces.d.ts","sourceRoot":"","sources":["../../src/tools/list-workspaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,eAAO,MAAM,kBAAkB;;;;;;;;CAS9B,CAAC;AAEF,wBAAsB,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG;;;;;GA4CjE"}
@@ -1,7 +1,7 @@
1
1
  import { listWorkspaces as listWorkspacesQuery } from '../queries/workspace-queries.js';
2
2
  export const listWorkspacesTool = {
3
3
  name: 'list_workspaces',
4
- description: 'Lists all workspaces you have access to with your role. Use list_projects to see projects in a workspace.',
4
+ description: 'Lists all workspaces you have access to with your role. Each workspace contains projects, agents, skills, tags, and workflows.',
5
5
  inputSchema: {
6
6
  type: 'object',
7
7
  properties: {},
@@ -32,7 +32,12 @@ export async function listWorkspaces(auth, _args) {
32
32
  output += ` Created: ${workspace.createdAt?.substring(0, 10) || 'Unknown'}\n`;
33
33
  output += '\n';
34
34
  });
35
- output += `💡 Use list_projects with a workspace ID to see projects in a workspace.`;
35
+ output += `💡 Explore your workspace:\n`;
36
+ output += ` • list_projects - See documentation projects\n`;
37
+ output += ` • list_agents - See AI agent configurations\n`;
38
+ output += ` • list_skills - See skills library\n`;
39
+ output += ` • list_tags - See all tags\n`;
40
+ output += ` • list_workflows - See available workflows`;
36
41
  return {
37
42
  content: [
38
43
  {
@@ -1 +1 @@
1
- {"version":3,"file":"list-workspaces.js","sourceRoot":"","sources":["../../src/tools/list-workspaces.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,IAAI,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAExF,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,iBAAiB;IACvB,WAAW,EACT,2GAA2G;IAC7G,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,EAAE;QACd,QAAQ,EAAE,EAAE;KACb;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAiB,EAAE,KAAU;IAChE,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE;QAC9C,eAAe,EAAE,KAAK;KACvB,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;IAE5C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,sBAAsB;iBAC7B;aACF;SACF,CAAC;IACJ,CAAC;IAED,0BAA0B;IAC1B,IAAI,MAAM,GAAG,uBAAuB,UAAU,CAAC,MAAM,aAAa,CAAC;IAEnE,UAAU,CAAC,OAAO,CAAC,CAAC,SAAc,EAAE,KAAa,EAAE,EAAE;QACnD,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,OAAO,SAAS,CAAC,IAAI,MAAM,CAAC;QAClD,MAAM,IAAI,UAAU,SAAS,CAAC,EAAE,IAAI,CAAC;QACrC,MAAM,IAAI,YAAY,SAAS,CAAC,IAAI,IAAI,CAAC;QACzC,MAAM,IAAI,eAAe,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,SAAS,IAAI,CAAC;QAChF,MAAM,IAAI,IAAI,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,0EAA0E,CAAC;IAErF,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,MAAM;aACb;SACF;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"list-workspaces.js","sourceRoot":"","sources":["../../src/tools/list-workspaces.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,IAAI,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAExF,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,iBAAiB;IACvB,WAAW,EACT,gIAAgI;IAClI,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,EAAE;QACd,QAAQ,EAAE,EAAE;KACb;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAiB,EAAE,KAAU;IAChE,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE;QAC9C,eAAe,EAAE,KAAK;KACvB,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;IAE5C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,sBAAsB;iBAC7B;aACF;SACF,CAAC;IACJ,CAAC;IAED,0BAA0B;IAC1B,IAAI,MAAM,GAAG,uBAAuB,UAAU,CAAC,MAAM,aAAa,CAAC;IAEnE,UAAU,CAAC,OAAO,CAAC,CAAC,SAAc,EAAE,KAAa,EAAE,EAAE;QACnD,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,OAAO,SAAS,CAAC,IAAI,MAAM,CAAC;QAClD,MAAM,IAAI,UAAU,SAAS,CAAC,EAAE,IAAI,CAAC;QACrC,MAAM,IAAI,YAAY,SAAS,CAAC,IAAI,IAAI,CAAC;QACzC,MAAM,IAAI,eAAe,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,SAAS,IAAI,CAAC;QAChF,MAAM,IAAI,IAAI,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,8BAA8B,CAAC;IACzC,MAAM,IAAI,mDAAmD,CAAC;IAC9D,MAAM,IAAI,kDAAkD,CAAC;IAC7D,MAAM,IAAI,yCAAyC,CAAC;IACpD,MAAM,IAAI,iCAAiC,CAAC;IAC5C,MAAM,IAAI,+CAA+C,CAAC;IAE1D,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,MAAM;aACb;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { AuthContext } from '../types.js';
2
+ export declare const loadWorkflowTool: {
3
+ name: string;
4
+ description: string;
5
+ inputSchema: {
6
+ type: string;
7
+ properties: {
8
+ workflowId: {
9
+ type: string;
10
+ description: string;
11
+ };
12
+ workspaceId: {
13
+ type: string;
14
+ description: string;
15
+ };
16
+ };
17
+ required: string[];
18
+ };
19
+ };
20
+ export declare function loadWorkflow(_auth: AuthContext, args: any): Promise<{
21
+ content: {
22
+ type: string;
23
+ text: string;
24
+ }[];
25
+ }>;
26
+ //# sourceMappingURL=load-workflow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-workflow.d.ts","sourceRoot":"","sources":["../../src/tools/load-workflow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI/C,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;CAkB5B,CAAC;AAEF,wBAAsB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG;;;;;GAgF/D"}
@@ -0,0 +1,87 @@
1
+ import { DoxHubApiClient } from '../api-client.js';
2
+ import { getCurrentProfile } from '../cli/credentials.js';
3
+ export const loadWorkflowTool = {
4
+ name: 'load_workflow',
5
+ description: 'Load all resources (files, agents, skills) associated with a workflow. Returns all files that have ALL of the workflow\'s tags (AND logic), grouped by project. Use this to quickly load everything you need for a specific task or context.',
6
+ inputSchema: {
7
+ type: 'object',
8
+ properties: {
9
+ workflowId: {
10
+ type: 'string',
11
+ description: 'Workflow ID to load',
12
+ },
13
+ workspaceId: {
14
+ type: 'string',
15
+ description: 'Optional: workspace ID (uses default if not specified)',
16
+ },
17
+ },
18
+ required: ['workflowId'],
19
+ },
20
+ };
21
+ export async function loadWorkflow(_auth, args) {
22
+ const { workflowId, workspaceId } = args || {};
23
+ if (!workflowId) {
24
+ throw new Error('workflowId is required');
25
+ }
26
+ const profile = getCurrentProfile();
27
+ if (!profile || !profile.accessToken) {
28
+ throw new Error('Not authenticated');
29
+ }
30
+ const client = new DoxHubApiClient(profile.apiUrl || 'https://api.doxhub.io/api/v1', profile.accessToken);
31
+ // Determine workspace ID
32
+ let targetWorkspaceId = workspaceId;
33
+ if (!targetWorkspaceId) {
34
+ // Get user's workspaces
35
+ const workspacesResponse = await client.get('/workspaces');
36
+ const workspaces = workspacesResponse.data || [];
37
+ if (workspaces.length === 0) {
38
+ throw new Error('No workspaces found');
39
+ }
40
+ targetWorkspaceId = workspaces[0].id;
41
+ }
42
+ // Load workflow and its resources
43
+ const response = await client.get(`/workspaces/${targetWorkspaceId}/workflows/${workflowId}/load`);
44
+ const result = response.data;
45
+ const { workflow, files, tagDetails } = result;
46
+ // Format tag details
47
+ const formattedTags = tagDetails.map((t) => ({
48
+ id: t.id,
49
+ value: t.value,
50
+ color: t.color,
51
+ }));
52
+ // Group files by project
53
+ const filesByProject = {};
54
+ files.forEach((file) => {
55
+ const projectId = file.projectId || 'unknown';
56
+ if (!filesByProject[projectId]) {
57
+ filesByProject[projectId] = [];
58
+ }
59
+ filesByProject[projectId].push({
60
+ id: file.id,
61
+ title: file.title,
62
+ path: file.path,
63
+ size: file.size,
64
+ status: file.status,
65
+ updatedAt: file.updatedAt,
66
+ });
67
+ });
68
+ return {
69
+ content: [
70
+ {
71
+ type: 'text',
72
+ text: JSON.stringify({
73
+ message: `Loaded workflow "${workflow.name}" with ${files.length} file(s)`,
74
+ workflow: {
75
+ id: workflow.id,
76
+ name: workflow.name,
77
+ description: workflow.description || null,
78
+ tags: formattedTags,
79
+ },
80
+ fileCount: files.length,
81
+ filesByProject,
82
+ }, null, 2),
83
+ },
84
+ ],
85
+ };
86
+ }
87
+ //# sourceMappingURL=load-workflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-workflow.js","sourceRoot":"","sources":["../../src/tools/load-workflow.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@doxhub/mcp-server",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "Central file system for team SOPs, coding standards, and AI constraints. AI follows your guidelines automatically.",
5
5
  "keywords": [
6
6
  "mcp",