@elnora-ai/mcp-server 0.2.0 → 0.4.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.
- package/CHANGELOG.md +27 -0
- package/dist/auth/clients-store.d.ts +1 -0
- package/dist/auth/clients-store.d.ts.map +1 -1
- package/dist/auth/clients-store.js +13 -1
- package/dist/auth/clients-store.js.map +1 -1
- package/dist/auth/provider.d.ts +2 -19
- package/dist/auth/provider.d.ts.map +1 -1
- package/dist/auth/provider.js +61 -19
- package/dist/auth/provider.js.map +1 -1
- package/dist/constants.d.ts +2 -3
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +18 -3
- package/dist/constants.js.map +1 -1
- package/dist/index.js +155 -24
- package/dist/index.js.map +1 -1
- package/dist/middleware/cors.js +1 -1
- package/dist/middleware/cors.js.map +1 -1
- package/dist/middleware/rate-limiter.d.ts.map +1 -1
- package/dist/middleware/rate-limiter.js +2 -1
- package/dist/middleware/rate-limiter.js.map +1 -1
- package/dist/middleware/tool-logging.d.ts +14 -0
- package/dist/middleware/tool-logging.d.ts.map +1 -1
- package/dist/middleware/tool-logging.js +49 -4
- package/dist/middleware/tool-logging.js.map +1 -1
- package/dist/server.d.ts +2 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +29 -2
- package/dist/server.js.map +1 -1
- package/dist/services/elnora-api-client.d.ts +12 -18
- package/dist/services/elnora-api-client.d.ts.map +1 -1
- package/dist/services/elnora-api-client.js +34 -42
- package/dist/services/elnora-api-client.js.map +1 -1
- package/dist/services/error-handler.d.ts.map +1 -1
- package/dist/services/error-handler.js +5 -6
- package/dist/services/error-handler.js.map +1 -1
- package/dist/tools/account.d.ts +5 -0
- package/dist/tools/account.d.ts.map +1 -0
- package/dist/tools/account.js +70 -0
- package/dist/tools/account.js.map +1 -0
- package/dist/tools/api-keys.d.ts +5 -0
- package/dist/tools/api-keys.d.ts.map +1 -0
- package/dist/tools/api-keys.js +53 -0
- package/dist/tools/api-keys.js.map +1 -0
- package/dist/tools/audit.d.ts +5 -0
- package/dist/tools/audit.d.ts.map +1 -0
- package/dist/tools/audit.js +28 -0
- package/dist/tools/audit.js.map +1 -0
- package/dist/tools/feedback.d.ts +5 -0
- package/dist/tools/feedback.d.ts.map +1 -0
- package/dist/tools/feedback.js +23 -0
- package/dist/tools/feedback.js.map +1 -0
- package/dist/tools/files.d.ts.map +1 -1
- package/dist/tools/files.js +275 -17
- package/dist/tools/files.js.map +1 -1
- package/dist/tools/flags.d.ts +5 -0
- package/dist/tools/flags.d.ts.map +1 -0
- package/dist/tools/flags.js +36 -0
- package/dist/tools/flags.js.map +1 -0
- package/dist/tools/folders.d.ts +5 -0
- package/dist/tools/folders.d.ts.map +1 -0
- package/dist/tools/folders.js +90 -0
- package/dist/tools/folders.js.map +1 -0
- package/dist/tools/health.d.ts +5 -0
- package/dist/tools/health.d.ts.map +1 -0
- package/dist/tools/health.js +19 -0
- package/dist/tools/health.js.map +1 -0
- package/dist/tools/library.d.ts +5 -0
- package/dist/tools/library.d.ts.map +1 -0
- package/dist/tools/library.js +93 -0
- package/dist/tools/library.js.map +1 -0
- package/dist/tools/messages.d.ts.map +1 -1
- package/dist/tools/messages.js +3 -10
- package/dist/tools/messages.js.map +1 -1
- package/dist/tools/orgs.d.ts +5 -0
- package/dist/tools/orgs.d.ts.map +1 -0
- package/dist/tools/orgs.js +221 -0
- package/dist/tools/orgs.js.map +1 -0
- package/dist/tools/projects.d.ts +5 -0
- package/dist/tools/projects.d.ts.map +1 -0
- package/dist/tools/projects.js +177 -0
- package/dist/tools/projects.js.map +1 -0
- package/dist/tools/protocols.d.ts.map +1 -1
- package/dist/tools/protocols.js +9 -24
- package/dist/tools/protocols.js.map +1 -1
- package/dist/tools/scope-guard.d.ts +0 -8
- package/dist/tools/scope-guard.d.ts.map +1 -1
- package/dist/tools/scope-guard.js +85 -10
- package/dist/tools/scope-guard.js.map +1 -1
- package/dist/tools/search.d.ts +5 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +60 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/tasks.d.ts.map +1 -1
- package/dist/tools/tasks.js +83 -29
- package/dist/tools/tasks.js.map +1 -1
- package/dist/tools/with-guard.d.ts.map +1 -1
- package/dist/tools/with-guard.js +21 -6
- package/dist/tools/with-guard.js.map +1 -1
- package/dist/types.d.ts +0 -43
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -1
package/dist/tools/protocols.js
CHANGED
|
@@ -1,41 +1,26 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { handleApiError } from "../services/error-handler.js";
|
|
3
3
|
import { withGuard } from "./with-guard.js";
|
|
4
|
+
import { LONG_REQUEST_TIMEOUT_MS } from "../constants.js";
|
|
4
5
|
export function registerProtocolTools(server, getClient, getContext) {
|
|
5
6
|
server.registerTool("elnora_generate_protocol", {
|
|
6
7
|
title: "Generate Protocol",
|
|
7
|
-
description:
|
|
8
|
-
|
|
9
|
-
Examples:
|
|
10
|
-
- "Generate a HEK 293 cell maintenance protocol"
|
|
11
|
-
- "Create a CRISPR guide RNA design protocol for BRCA1"
|
|
12
|
-
- "Write a western blot protocol for detecting p53 in HeLa cells"`,
|
|
8
|
+
description: "Generate a bioprotocol using Elnora AI. Creates a task, sends the description, and returns the result. Takes 30-120s.",
|
|
13
9
|
inputSchema: {
|
|
14
10
|
description: z.string().min(10).max(5000).describe("Protocol description"),
|
|
15
|
-
title: z.string().max(200).optional().describe("Task title
|
|
16
|
-
},
|
|
17
|
-
annotations: {
|
|
18
|
-
readOnlyHint: false,
|
|
19
|
-
destructiveHint: false,
|
|
20
|
-
idempotentHint: false,
|
|
21
|
-
openWorldHint: true,
|
|
11
|
+
title: z.string().max(200).optional().describe("Task title"),
|
|
22
12
|
},
|
|
13
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },
|
|
23
14
|
}, withGuard("elnora_generate_protocol", getContext, async ({ description, title }) => {
|
|
24
15
|
try {
|
|
25
16
|
const client = getClient();
|
|
26
|
-
|
|
27
|
-
const taskTitle = title || description.slice(0, 100);
|
|
28
|
-
const task = await client.createTask(taskTitle);
|
|
29
|
-
// 2. Send the description as a message
|
|
17
|
+
const task = await client.post("/tasks", { title: title || description.slice(0, 100) }, { timeout: LONG_REQUEST_TIMEOUT_MS });
|
|
30
18
|
const response = await client.sendMessage(task.id, description);
|
|
31
|
-
// 3. Return the result
|
|
32
|
-
const result = {
|
|
33
|
-
task_id: task.id,
|
|
34
|
-
protocol_content: response.content,
|
|
35
|
-
message_id: response.id,
|
|
36
|
-
};
|
|
37
19
|
return {
|
|
38
|
-
content: [{ type: "text", text: JSON.stringify(
|
|
20
|
+
content: [{ type: "text", text: JSON.stringify({
|
|
21
|
+
task_id: task.id,
|
|
22
|
+
response,
|
|
23
|
+
}) }],
|
|
39
24
|
};
|
|
40
25
|
}
|
|
41
26
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocols.js","sourceRoot":"","sources":["../../src/tools/protocols.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"protocols.js","sourceRoot":"","sources":["../../src/tools/protocols.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,MAAM,UAAU,qBAAqB,CACnC,MAAiB,EACjB,SAAgC,EAChC,UAAgC;IAEhC,MAAM,CAAC,YAAY,CACjB,0BAA0B,EAC1B;QACE,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EAAE,uHAAuH;QACpI,WAAW,EAAE;YACX,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC;YAC1E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;SAC7D;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE;KACzG,EACD,SAAS,CAAC,0BAA0B,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE;QACjF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAiB,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAC;YAC9I,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;YAChE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACtD,OAAO,EAAE,IAAI,CAAC,EAAE;4BAChB,QAAQ;yBACT,CAAC,EAAE,CAAC;aACN,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC9F,CAAC;IACH,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -1,14 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Per-tool scope enforcement.
|
|
3
3
|
* CoSAI MCP-T2: Least privilege — each tool declares required scopes.
|
|
4
|
-
*
|
|
5
|
-
* Scope mapping:
|
|
6
|
-
* - elnora_list_tasks, elnora_get_task_messages → tasks:read
|
|
7
|
-
* - elnora_create_task → tasks:write
|
|
8
|
-
* - elnora_send_message → messages:write
|
|
9
|
-
* - elnora_list_files, elnora_get_file_content → files:read
|
|
10
|
-
* - elnora_upload_file → files:write
|
|
11
|
-
* - elnora_generate_protocol → tasks:write, messages:write
|
|
12
4
|
*/
|
|
13
5
|
export declare const TOOL_SCOPES: Record<string, string[]>;
|
|
14
6
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope-guard.d.ts","sourceRoot":"","sources":["../../src/tools/scope-guard.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"scope-guard.d.ts","sourceRoot":"","sources":["../../src/tools/scope-guard.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAsGhD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAQnF"}
|
|
@@ -1,24 +1,96 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Per-tool scope enforcement.
|
|
3
3
|
* CoSAI MCP-T2: Least privilege — each tool declares required scopes.
|
|
4
|
-
*
|
|
5
|
-
* Scope mapping:
|
|
6
|
-
* - elnora_list_tasks, elnora_get_task_messages → tasks:read
|
|
7
|
-
* - elnora_create_task → tasks:write
|
|
8
|
-
* - elnora_send_message → messages:write
|
|
9
|
-
* - elnora_list_files, elnora_get_file_content → files:read
|
|
10
|
-
* - elnora_upload_file → files:write
|
|
11
|
-
* - elnora_generate_protocol → tasks:write, messages:write
|
|
12
4
|
*/
|
|
13
5
|
export const TOOL_SCOPES = {
|
|
6
|
+
// Tasks
|
|
14
7
|
elnora_list_tasks: ["tasks:read"],
|
|
8
|
+
elnora_get_task: ["tasks:read"],
|
|
15
9
|
elnora_get_task_messages: ["tasks:read"],
|
|
16
10
|
elnora_create_task: ["tasks:write"],
|
|
11
|
+
elnora_update_task: ["tasks:write"],
|
|
12
|
+
elnora_archive_task: ["tasks:write"],
|
|
13
|
+
// Messages
|
|
17
14
|
elnora_send_message: ["messages:write"],
|
|
15
|
+
// Files
|
|
18
16
|
elnora_list_files: ["files:read"],
|
|
17
|
+
elnora_get_file: ["files:read"],
|
|
19
18
|
elnora_get_file_content: ["files:read"],
|
|
19
|
+
elnora_get_file_versions: ["files:read"],
|
|
20
|
+
elnora_get_version_content: ["files:read"],
|
|
20
21
|
elnora_upload_file: ["files:write"],
|
|
22
|
+
elnora_create_file: ["files:write"],
|
|
23
|
+
elnora_update_file: ["files:write"],
|
|
24
|
+
elnora_archive_file: ["files:write"],
|
|
25
|
+
elnora_download_file: ["files:read"],
|
|
26
|
+
elnora_create_version: ["files:write"],
|
|
27
|
+
elnora_restore_version: ["files:write"],
|
|
28
|
+
elnora_promote_file: ["files:write"],
|
|
29
|
+
elnora_fork_file: ["files:write"],
|
|
30
|
+
elnora_create_working_copy: ["files:write"],
|
|
31
|
+
elnora_commit_working_copy: ["files:write"],
|
|
32
|
+
elnora_initiate_upload: ["files:write"],
|
|
33
|
+
elnora_confirm_upload: ["files:write"],
|
|
34
|
+
// Projects
|
|
35
|
+
elnora_list_projects: ["projects:read"],
|
|
36
|
+
elnora_get_project: ["projects:read"],
|
|
37
|
+
elnora_create_project: ["projects:write"],
|
|
38
|
+
elnora_update_project: ["projects:write"],
|
|
39
|
+
elnora_archive_project: ["projects:write"],
|
|
40
|
+
elnora_list_project_members: ["projects:read"],
|
|
41
|
+
elnora_add_project_member: ["projects:write"],
|
|
42
|
+
elnora_update_project_member_role: ["projects:write"],
|
|
43
|
+
elnora_remove_project_member: ["projects:write"],
|
|
44
|
+
elnora_leave_project: ["projects:write"],
|
|
45
|
+
// Search
|
|
46
|
+
elnora_search_tasks: ["search:read"],
|
|
47
|
+
elnora_search_files: ["search:read"],
|
|
48
|
+
elnora_search_all: ["search:read"],
|
|
49
|
+
// Organizations
|
|
50
|
+
elnora_list_orgs: ["orgs:read"],
|
|
51
|
+
elnora_get_org: ["orgs:read"],
|
|
52
|
+
elnora_create_org: ["orgs:write"],
|
|
53
|
+
elnora_update_org: ["orgs:write"],
|
|
54
|
+
elnora_list_org_members: ["orgs:read"],
|
|
55
|
+
elnora_update_org_member_role: ["orgs:write"],
|
|
56
|
+
elnora_remove_org_member: ["orgs:write"],
|
|
57
|
+
elnora_get_org_billing: ["orgs:read"],
|
|
58
|
+
elnora_invite_org_member: ["orgs:write"],
|
|
59
|
+
elnora_list_org_invitations: ["orgs:read"],
|
|
60
|
+
elnora_cancel_org_invitation: ["orgs:write"],
|
|
61
|
+
elnora_get_invitation_info: ["orgs:read"],
|
|
62
|
+
elnora_accept_invitation: ["orgs:write"],
|
|
63
|
+
// Folders
|
|
64
|
+
elnora_list_folders: ["folders:read"],
|
|
65
|
+
elnora_create_folder: ["folders:write"],
|
|
66
|
+
elnora_rename_folder: ["folders:write"],
|
|
67
|
+
elnora_move_folder: ["folders:write"],
|
|
68
|
+
elnora_delete_folder: ["folders:write"],
|
|
69
|
+
// Library
|
|
70
|
+
elnora_list_library_files: ["library:read"],
|
|
71
|
+
elnora_list_library_folders: ["library:read"],
|
|
72
|
+
elnora_create_library_folder: ["library:write"],
|
|
73
|
+
elnora_rename_library_folder: ["library:write"],
|
|
74
|
+
elnora_delete_library_folder: ["library:write"],
|
|
75
|
+
// API Keys
|
|
76
|
+
elnora_list_api_keys: ["api-keys:read"],
|
|
77
|
+
elnora_create_api_key: ["api-keys:write"],
|
|
78
|
+
elnora_revoke_api_key: ["api-keys:write"],
|
|
79
|
+
// Audit
|
|
80
|
+
elnora_list_audit_log: ["audit:read"],
|
|
81
|
+
// Account
|
|
82
|
+
elnora_get_account: ["account:read"],
|
|
83
|
+
elnora_update_account: ["account:write"],
|
|
84
|
+
elnora_list_agreements: ["account:read"],
|
|
85
|
+
elnora_accept_terms: ["account:write"],
|
|
86
|
+
// Feedback
|
|
87
|
+
elnora_submit_feedback: ["feedback:write"],
|
|
88
|
+
// Protocol (convenience)
|
|
21
89
|
elnora_generate_protocol: ["tasks:write", "messages:write"],
|
|
90
|
+
// Flags & Health — no scopes required (public endpoints)
|
|
91
|
+
elnora_list_flags: [],
|
|
92
|
+
elnora_get_flag: [],
|
|
93
|
+
elnora_health_check: [],
|
|
22
94
|
};
|
|
23
95
|
/**
|
|
24
96
|
* Check if the given scopes satisfy the required scopes for a tool.
|
|
@@ -26,8 +98,11 @@ export const TOOL_SCOPES = {
|
|
|
26
98
|
*/
|
|
27
99
|
export function checkToolScopes(toolName, grantedScopes) {
|
|
28
100
|
const required = TOOL_SCOPES[toolName];
|
|
29
|
-
if (!required)
|
|
30
|
-
|
|
101
|
+
if (!required) {
|
|
102
|
+
// Deny-by-default: unknown tools must not bypass scope checks (CoSAI MCP-T2)
|
|
103
|
+
return ["unknown_tool"];
|
|
104
|
+
}
|
|
105
|
+
// Empty array means no scopes required (e.g. health check) — always allowed
|
|
31
106
|
return required.filter((s) => !grantedScopes.includes(s));
|
|
32
107
|
}
|
|
33
108
|
//# sourceMappingURL=scope-guard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope-guard.js","sourceRoot":"","sources":["../../src/tools/scope-guard.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"scope-guard.js","sourceRoot":"","sources":["../../src/tools/scope-guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { ElnoraApiClient } from "../services/elnora-api-client.js";
|
|
3
|
+
import { RequestContext } from "../server.js";
|
|
4
|
+
export declare function registerSearchTools(server: McpServer, getClient: () => ElnoraApiClient, getContext: () => RequestContext): void;
|
|
5
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAI9C,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,eAAe,EAChC,UAAU,EAAE,MAAM,cAAc,GAC/B,IAAI,CAkEN"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { handleApiError } from "../services/error-handler.js";
|
|
3
|
+
import { withGuard } from "./with-guard.js";
|
|
4
|
+
export function registerSearchTools(server, getClient, getContext) {
|
|
5
|
+
server.registerTool("elnora_search_tasks", {
|
|
6
|
+
title: "Search Tasks",
|
|
7
|
+
description: "Full-text search across tasks.",
|
|
8
|
+
inputSchema: {
|
|
9
|
+
query: z.string().min(1).max(1000).describe("Search query"),
|
|
10
|
+
page: z.number().int().min(1).default(1).describe("Page number"),
|
|
11
|
+
page_size: z.number().int().min(1).max(100).default(25).describe("Results per page"),
|
|
12
|
+
},
|
|
13
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
|
|
14
|
+
}, withGuard("elnora_search_tasks", getContext, async ({ query, page, page_size }) => {
|
|
15
|
+
try {
|
|
16
|
+
const result = await getClient().get("/search/tasks", { q: query, page, pageSize: page_size });
|
|
17
|
+
return { content: [{ type: "text", text: JSON.stringify(result) }] };
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
return { content: [{ type: "text", text: handleApiError(error) }], isError: true };
|
|
21
|
+
}
|
|
22
|
+
}));
|
|
23
|
+
server.registerTool("elnora_search_files", {
|
|
24
|
+
title: "Search Files",
|
|
25
|
+
description: "Full-text search across files.",
|
|
26
|
+
inputSchema: {
|
|
27
|
+
query: z.string().min(1).max(1000).describe("Search query"),
|
|
28
|
+
page: z.number().int().min(1).default(1).describe("Page number"),
|
|
29
|
+
page_size: z.number().int().min(1).max(100).default(25).describe("Results per page"),
|
|
30
|
+
},
|
|
31
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
|
|
32
|
+
}, withGuard("elnora_search_files", getContext, async ({ query, page, page_size }) => {
|
|
33
|
+
try {
|
|
34
|
+
const result = await getClient().get("/search/files", { q: query, page, pageSize: page_size });
|
|
35
|
+
return { content: [{ type: "text", text: JSON.stringify(result) }] };
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
return { content: [{ type: "text", text: handleApiError(error) }], isError: true };
|
|
39
|
+
}
|
|
40
|
+
}));
|
|
41
|
+
server.registerTool("elnora_search_all", {
|
|
42
|
+
title: "Search All",
|
|
43
|
+
description: "Full-text search across all resources (tasks, files, etc.).",
|
|
44
|
+
inputSchema: {
|
|
45
|
+
query: z.string().min(1).max(1000).describe("Search query"),
|
|
46
|
+
page: z.number().int().min(1).default(1).describe("Page number"),
|
|
47
|
+
page_size: z.number().int().min(1).max(100).default(25).describe("Results per page"),
|
|
48
|
+
},
|
|
49
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
|
|
50
|
+
}, withGuard("elnora_search_all", getContext, async ({ query, page, page_size }) => {
|
|
51
|
+
try {
|
|
52
|
+
const result = await getClient().get("/search", { q: query, page, pageSize: page_size });
|
|
53
|
+
return { content: [{ type: "text", text: JSON.stringify(result) }] };
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
return { content: [{ type: "text", text: handleApiError(error) }], isError: true };
|
|
57
|
+
}
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAI9C,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,eAAe,EAChC,UAAU,EAAE,MAAM,cAAc,GAC/B,IAAI,
|
|
1
|
+
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAI9C,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,eAAe,EAChC,UAAU,EAAE,MAAM,cAAc,GAC/B,IAAI,CAyIN"}
|
package/dist/tools/tasks.js
CHANGED
|
@@ -4,22 +4,25 @@ import { withGuard } from "./with-guard.js";
|
|
|
4
4
|
export function registerTaskTools(server, getClient, getContext) {
|
|
5
5
|
server.registerTool("elnora_create_task", {
|
|
6
6
|
title: "Create Task",
|
|
7
|
-
description: "Create a new task (conversation)
|
|
7
|
+
description: "Create a new task (conversation thread). Each task is a chat where you send messages and receive AI responses.",
|
|
8
8
|
inputSchema: {
|
|
9
|
-
|
|
9
|
+
project_id: z.string().uuid().optional().describe("Project UUID (optional)"),
|
|
10
|
+
title: z.string().max(200).optional().describe("Task title"),
|
|
11
|
+
initial_message: z.string().max(50_000).optional().describe("Initial message to send"),
|
|
12
|
+
context_file_ids: z.array(z.string().uuid()).optional().describe("File IDs for context"),
|
|
10
13
|
},
|
|
11
|
-
annotations: {
|
|
12
|
-
|
|
13
|
-
destructiveHint: false,
|
|
14
|
-
idempotentHint: false,
|
|
15
|
-
openWorldHint: true,
|
|
16
|
-
},
|
|
17
|
-
}, withGuard("elnora_create_task", getContext, async ({ title }) => {
|
|
14
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },
|
|
15
|
+
}, withGuard("elnora_create_task", getContext, async ({ project_id, title, initial_message, context_file_ids }) => {
|
|
18
16
|
try {
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
17
|
+
const body = { title: title || "New Task" };
|
|
18
|
+
if (project_id)
|
|
19
|
+
body.projectId = project_id;
|
|
20
|
+
if (initial_message)
|
|
21
|
+
body.initialMessage = initial_message;
|
|
22
|
+
if (context_file_ids)
|
|
23
|
+
body.contextFileIds = context_file_ids;
|
|
24
|
+
const result = await getClient().post("/tasks", body);
|
|
25
|
+
return { content: [{ type: "text", text: JSON.stringify(result) }] };
|
|
23
26
|
}
|
|
24
27
|
catch (error) {
|
|
25
28
|
return { content: [{ type: "text", text: handleApiError(error) }], isError: true };
|
|
@@ -27,19 +30,35 @@ export function registerTaskTools(server, getClient, getContext) {
|
|
|
27
30
|
}));
|
|
28
31
|
server.registerTool("elnora_list_tasks", {
|
|
29
32
|
title: "List Tasks",
|
|
30
|
-
description: "List tasks
|
|
33
|
+
description: "List tasks. Optionally filter by project or status.",
|
|
31
34
|
inputSchema: {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
+
project_id: z.string().uuid().optional().describe("Filter by project UUID"),
|
|
36
|
+
status: z.string().optional().describe("Filter by status"),
|
|
37
|
+
page: z.number().int().min(1).default(1).describe("Page number"),
|
|
38
|
+
page_size: z.number().int().min(1).max(100).default(25).describe("Results per page"),
|
|
35
39
|
},
|
|
36
40
|
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
|
|
37
|
-
}, withGuard("elnora_list_tasks", getContext, async ({ status,
|
|
41
|
+
}, withGuard("elnora_list_tasks", getContext, async ({ project_id, status, page, page_size }) => {
|
|
38
42
|
try {
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
+
const path = project_id ? `/projects/${project_id}/tasks` : "/tasks";
|
|
44
|
+
const result = await getClient().get(path, { page, pageSize: page_size, status });
|
|
45
|
+
return { content: [{ type: "text", text: JSON.stringify(result) }] };
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
return { content: [{ type: "text", text: handleApiError(error) }], isError: true };
|
|
49
|
+
}
|
|
50
|
+
}));
|
|
51
|
+
server.registerTool("elnora_get_task", {
|
|
52
|
+
title: "Get Task",
|
|
53
|
+
description: "Get a single task by UUID.",
|
|
54
|
+
inputSchema: {
|
|
55
|
+
task_id: z.string().uuid().describe("Task UUID"),
|
|
56
|
+
},
|
|
57
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
|
|
58
|
+
}, withGuard("elnora_get_task", getContext, async ({ task_id }) => {
|
|
59
|
+
try {
|
|
60
|
+
const result = await getClient().get(`/tasks/${task_id}`);
|
|
61
|
+
return { content: [{ type: "text", text: JSON.stringify(result) }] };
|
|
43
62
|
}
|
|
44
63
|
catch (error) {
|
|
45
64
|
return { content: [{ type: "text", text: handleApiError(error) }], isError: true };
|
|
@@ -47,19 +66,54 @@ export function registerTaskTools(server, getClient, getContext) {
|
|
|
47
66
|
}));
|
|
48
67
|
server.registerTool("elnora_get_task_messages", {
|
|
49
68
|
title: "Get Task Messages",
|
|
50
|
-
description: "Get
|
|
69
|
+
description: "Get message history for a task.",
|
|
51
70
|
inputSchema: {
|
|
52
71
|
task_id: z.string().uuid().describe("Task UUID"),
|
|
53
72
|
limit: z.number().int().min(1).max(100).default(50).describe("Max messages"),
|
|
54
|
-
|
|
73
|
+
cursor: z.string().optional().describe("Cursor for pagination"),
|
|
55
74
|
},
|
|
56
75
|
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
|
|
57
|
-
}, withGuard("elnora_get_task_messages", getContext, async ({ task_id, limit,
|
|
76
|
+
}, withGuard("elnora_get_task_messages", getContext, async ({ task_id, limit, cursor }) => {
|
|
77
|
+
try {
|
|
78
|
+
const params = { limit };
|
|
79
|
+
if (cursor)
|
|
80
|
+
params.cursor = cursor;
|
|
81
|
+
const result = await getClient().get(`/tasks/${task_id}/messages`, params);
|
|
82
|
+
return { content: [{ type: "text", text: JSON.stringify(result) }] };
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
return { content: [{ type: "text", text: handleApiError(error) }], isError: true };
|
|
86
|
+
}
|
|
87
|
+
}));
|
|
88
|
+
server.registerTool("elnora_update_task", {
|
|
89
|
+
title: "Update Task",
|
|
90
|
+
description: "Update task title or status.",
|
|
91
|
+
inputSchema: {
|
|
92
|
+
task_id: z.string().uuid().describe("Task UUID"),
|
|
93
|
+
title: z.string().max(200).optional().describe("New title"),
|
|
94
|
+
status: z.string().optional().describe("New status"),
|
|
95
|
+
},
|
|
96
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },
|
|
97
|
+
}, withGuard("elnora_update_task", getContext, async ({ task_id, title, status }) => {
|
|
98
|
+
try {
|
|
99
|
+
const result = await getClient().put(`/tasks/${task_id}`, { title, status });
|
|
100
|
+
return { content: [{ type: "text", text: JSON.stringify(result) }] };
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
return { content: [{ type: "text", text: handleApiError(error) }], isError: true };
|
|
104
|
+
}
|
|
105
|
+
}));
|
|
106
|
+
server.registerTool("elnora_archive_task", {
|
|
107
|
+
title: "Archive Task",
|
|
108
|
+
description: "Archive (delete) a task.",
|
|
109
|
+
inputSchema: {
|
|
110
|
+
task_id: z.string().uuid().describe("Task UUID"),
|
|
111
|
+
},
|
|
112
|
+
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true },
|
|
113
|
+
}, withGuard("elnora_archive_task", getContext, async ({ task_id }) => {
|
|
58
114
|
try {
|
|
59
|
-
|
|
60
|
-
return {
|
|
61
|
-
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
62
|
-
};
|
|
115
|
+
await getClient().del(`/tasks/${task_id}`);
|
|
116
|
+
return { content: [{ type: "text", text: JSON.stringify({ archived: true, taskId: task_id }) }] };
|
|
63
117
|
}
|
|
64
118
|
catch (error) {
|
|
65
119
|
return { content: [{ type: "text", text: handleApiError(error) }], isError: true };
|
package/dist/tools/tasks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,UAAU,iBAAiB,CAC/B,MAAiB,EACjB,SAAgC,EAChC,UAAgC;IAEhC,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,KAAK,EAAE,aAAa;QACpB,WAAW,
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"with-guard.d.ts","sourceRoot":"","sources":["../../src/tools/with-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAI9C;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACzD,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,cAAc,EAChC,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC;IAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GAChG,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC;IAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"with-guard.d.ts","sourceRoot":"","sources":["../../src/tools/with-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAI9C;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACzD,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,cAAc,EAChC,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC;IAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GAChG,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC;IAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAwC1F"}
|
package/dist/tools/with-guard.js
CHANGED
|
@@ -21,12 +21,27 @@ export function withGuard(toolName, getContext, handler) {
|
|
|
21
21
|
};
|
|
22
22
|
}
|
|
23
23
|
// Execute handler
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
24
|
+
try {
|
|
25
|
+
const result = await handler(params);
|
|
26
|
+
logToolInvocation(toolName, params, ctx.clientId, {
|
|
27
|
+
success: !result.isError,
|
|
28
|
+
durationMs: Date.now() - start,
|
|
29
|
+
});
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
logToolInvocation(toolName, params, ctx.clientId, {
|
|
34
|
+
success: false,
|
|
35
|
+
durationMs: Date.now() - start,
|
|
36
|
+
});
|
|
37
|
+
return {
|
|
38
|
+
content: [{
|
|
39
|
+
type: "text",
|
|
40
|
+
text: `Error: Unexpected error in ${toolName}: ${error instanceof Error ? error.message : String(error)}`,
|
|
41
|
+
}],
|
|
42
|
+
isError: true,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
30
45
|
};
|
|
31
46
|
}
|
|
32
47
|
//# sourceMappingURL=with-guard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"with-guard.js","sourceRoot":"","sources":["../../src/tools/with-guard.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE;;;GAGG;AACH,MAAM,UAAU,SAAS,CACvB,QAAgB,EAChB,UAAgC,EAChC,OAAiG;IAEjG,OAAO,KAAK,EAAE,MAAS,EAAE,EAAE;QACzB,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEzB,oBAAoB;QACpB,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;YACtG,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,uCAAuC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,6CAA6C;qBAC7G,CAAC;gBACF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,kBAAkB;QAClB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"with-guard.js","sourceRoot":"","sources":["../../src/tools/with-guard.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE;;;GAGG;AACH,MAAM,UAAU,SAAS,CACvB,QAAgB,EAChB,UAAgC,EAChC,OAAiG;IAEjG,OAAO,KAAK,EAAE,MAAS,EAAE,EAAE;QACzB,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEzB,oBAAoB;QACpB,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;YACtG,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,uCAAuC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,6CAA6C;qBAC7G,CAAC;gBACF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,kBAAkB;QAClB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;YACrC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,QAAQ,EAAE;gBAChD,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO;gBACxB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;aAC/B,CAAC,CAAC;YACH,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,QAAQ,EAAE;gBAChD,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;aAC/B,CAAC,CAAC;YACH,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,8BAA8B,QAAQ,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBAC1G,CAAC;gBACF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
export interface ElnoraConfig {
|
|
2
2
|
apiUrl: string;
|
|
3
|
-
authUrl: string;
|
|
4
3
|
tokenValidationUrl: string;
|
|
5
4
|
port: number;
|
|
6
5
|
/** Public-facing base URL of the MCP server (e.g. https://mcp.elnora.ai) */
|
|
@@ -14,48 +13,6 @@ export interface ElnoraConfig {
|
|
|
14
13
|
/** Client secret for the MCP server as an OAuth client of the Elnora platform */
|
|
15
14
|
platformClientSecret: string;
|
|
16
15
|
}
|
|
17
|
-
export interface AuthContext {
|
|
18
|
-
userId: number;
|
|
19
|
-
organizationId: string;
|
|
20
|
-
scopes: string;
|
|
21
|
-
tokenType: string;
|
|
22
|
-
}
|
|
23
|
-
export interface ElnoraTask {
|
|
24
|
-
id: string;
|
|
25
|
-
title: string;
|
|
26
|
-
status: string;
|
|
27
|
-
createdAt: string;
|
|
28
|
-
updatedAt: string;
|
|
29
|
-
}
|
|
30
|
-
export interface ElnoraMessage {
|
|
31
|
-
id: string;
|
|
32
|
-
taskId: string;
|
|
33
|
-
role: "user" | "assistant";
|
|
34
|
-
content: string;
|
|
35
|
-
createdAt: string;
|
|
36
|
-
agentName?: string;
|
|
37
|
-
}
|
|
38
|
-
export interface ElnoraFile {
|
|
39
|
-
id: string;
|
|
40
|
-
name: string;
|
|
41
|
-
fileType: string;
|
|
42
|
-
visibility: string;
|
|
43
|
-
createdAt: string;
|
|
44
|
-
latestVersionId?: string;
|
|
45
|
-
}
|
|
46
|
-
export interface TokenValidationResult {
|
|
47
|
-
valid: boolean;
|
|
48
|
-
userId?: number;
|
|
49
|
-
organizationId?: string;
|
|
50
|
-
scopes?: string;
|
|
51
|
-
tokenType?: string;
|
|
52
|
-
}
|
|
53
|
-
export interface PaginatedResponse<T> {
|
|
54
|
-
items: T[];
|
|
55
|
-
totalCount: number;
|
|
56
|
-
hasMore: boolean;
|
|
57
|
-
nextOffset?: number;
|
|
58
|
-
}
|
|
59
16
|
/** Stored authorization session for PKCE flow */
|
|
60
17
|
export interface AuthorizationSession {
|
|
61
18
|
clientId: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,MAAM,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,SAAS,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,gBAAgB,EAAE,MAAM,CAAC;IACzB,6EAA6E;IAC7E,gBAAgB,EAAE,MAAM,CAAC;IACzB,iFAAiF;IACjF,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,iDAAiD;AACjD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,2BAA2B;AAC3B,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elnora-ai/mcp-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"mcpName": "io.github.Elnora-AI/elnora-mcp-server",
|
|
5
5
|
"description": "MCP server for Elnora Platform — AI-powered bioprotocol optimization",
|
|
6
6
|
"type": "module",
|
|
@@ -43,6 +43,7 @@
|
|
|
43
43
|
"@modelcontextprotocol/sdk": "^1.27.0",
|
|
44
44
|
"axios": "^1.8.0",
|
|
45
45
|
"express": "^5.1.0",
|
|
46
|
+
"express-rate-limit": "^8.3.0",
|
|
46
47
|
"zod": "^3.24.0"
|
|
47
48
|
},
|
|
48
49
|
"devDependencies": {
|