noverload-mcp 0.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.
package/README.md ADDED
@@ -0,0 +1,95 @@
1
+ # @noverload/mcp-server
2
+
3
+ Connect your Noverload saved content to AI assistants like Claude, Cursor, and Windsurf using the Model Context Protocol (MCP).
4
+
5
+ ## Features
6
+
7
+ - 📚 Access all your saved content (YouTube, X posts, Reddit, articles, PDFs)
8
+ - 🔍 Search through your content library
9
+ - ✅ View and complete action items
10
+ - 🎯 Reference your Health, Wealth, and Relationships goals
11
+ - 🔒 Secure access with personal access tokens
12
+ - 📝 Read-only mode by default for safety
13
+
14
+ ## Installation
15
+
16
+ ```bash
17
+ npm install -g @noverload/mcp-server
18
+ ```
19
+
20
+ ## Quick Start
21
+
22
+ ### 1. Get Your Access Token
23
+
24
+ 1. Log in to [Noverload](https://www.noverload.com)
25
+ 2. Go to Settings → Apps
26
+ 3. Click "New Token" and create a personal access token
27
+ 4. Copy the token (you won't be able to see it again)
28
+
29
+ ### 2. Configure Your AI Tool
30
+
31
+ #### Claude Desktop
32
+
33
+ Add to your Claude configuration file:
34
+ - macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
35
+ - Windows: `%APPDATA%\Claude\claude_desktop_config.json`
36
+
37
+ ```json
38
+ {
39
+ "mcpServers": {
40
+ "noverload": {
41
+ "command": "npx",
42
+ "args": ["-y", "@noverload/mcp-server"],
43
+ "env": {
44
+ "NOVERLOAD_CONFIG": "{\"accessToken\":\"YOUR_TOKEN_HERE\",\"readOnly\":true}"
45
+ }
46
+ }
47
+ }
48
+ }
49
+ ```
50
+
51
+ #### Cursor
52
+
53
+ 1. Open Cursor Settings
54
+ 2. Navigate to Features → Model Context Protocol
55
+ 3. Add the same configuration as above
56
+
57
+ #### Windsurf
58
+
59
+ Add to your Windsurf MCP configuration with the same format as Claude Desktop.
60
+
61
+ ## Available Commands
62
+
63
+ Once configured, your AI assistant can:
64
+
65
+ - **list_saved_content** - Browse your saved content library
66
+ - **get_content_details** - Get full details including summaries and insights
67
+ - **search_content** - Search through your content by keywords
68
+ - **list_actions** - View action items extracted from content
69
+ - **list_goals** - See your Health, Wealth, and Relationships goals
70
+ - **save_content** - Save new URLs (when read-only is disabled)
71
+ - **complete_action** - Mark action items as completed (when read-only is disabled)
72
+
73
+ ## Configuration Options
74
+
75
+ | Option | Type | Default | Description |
76
+ |--------|------|---------|-------------|
77
+ | `accessToken` | string | required | Your Noverload personal access token |
78
+ | `apiUrl` | string | `https://www.noverload.com` | API endpoint (for self-hosting) |
79
+ | `readOnly` | boolean | `true` | Restrict to read-only operations |
80
+
81
+ ## Security
82
+
83
+ - **Use Read-Only Mode**: Keep `readOnly: true` unless you need write access
84
+ - **Protect Your Token**: Never share your personal access token
85
+ - **Revoke When Needed**: You can revoke tokens anytime from Noverload settings
86
+
87
+ ## Support
88
+
89
+ - [Documentation](https://www.noverload.com/docs)
90
+ - [GitHub Issues](https://github.com/noverload/mcp-server/issues)
91
+ - Email: support@noverload.com
92
+
93
+ ## License
94
+
95
+ MIT © Noverload
@@ -0,0 +1,140 @@
1
+ import { z } from "zod";
2
+ export interface ClientConfig {
3
+ accessToken: string;
4
+ apiUrl: string;
5
+ readOnly: boolean;
6
+ }
7
+ export declare const ContentSchema: z.ZodObject<{
8
+ id: z.ZodString;
9
+ userId: z.ZodString;
10
+ url: z.ZodString;
11
+ title: z.ZodNullable<z.ZodString>;
12
+ description: z.ZodNullable<z.ZodString>;
13
+ contentType: z.ZodEnum<["youtube", "x_post", "reddit", "article", "pdf"]>;
14
+ status: z.ZodEnum<["pending", "processing", "completed", "failed"]>;
15
+ summary: z.ZodNullable<z.ZodAny>;
16
+ keyInsights: z.ZodNullable<z.ZodArray<z.ZodString, "many">>;
17
+ rawText: z.ZodOptional<z.ZodNullable<z.ZodString>>;
18
+ ogImage: z.ZodOptional<z.ZodNullable<z.ZodString>>;
19
+ processingMetadata: z.ZodOptional<z.ZodNullable<z.ZodAny>>;
20
+ tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
21
+ createdAt: z.ZodString;
22
+ updatedAt: z.ZodString;
23
+ }, "strip", z.ZodTypeAny, {
24
+ id: string;
25
+ userId: string;
26
+ url: string;
27
+ title: string | null;
28
+ description: string | null;
29
+ contentType: "youtube" | "x_post" | "reddit" | "article" | "pdf";
30
+ status: "pending" | "processing" | "completed" | "failed";
31
+ keyInsights: string[] | null;
32
+ createdAt: string;
33
+ updatedAt: string;
34
+ summary?: any;
35
+ rawText?: string | null | undefined;
36
+ ogImage?: string | null | undefined;
37
+ processingMetadata?: any;
38
+ tags?: string[] | undefined;
39
+ }, {
40
+ id: string;
41
+ userId: string;
42
+ url: string;
43
+ title: string | null;
44
+ description: string | null;
45
+ contentType: "youtube" | "x_post" | "reddit" | "article" | "pdf";
46
+ status: "pending" | "processing" | "completed" | "failed";
47
+ keyInsights: string[] | null;
48
+ createdAt: string;
49
+ updatedAt: string;
50
+ summary?: any;
51
+ rawText?: string | null | undefined;
52
+ ogImage?: string | null | undefined;
53
+ processingMetadata?: any;
54
+ tags?: string[] | undefined;
55
+ }>;
56
+ export declare const ActionSchema: z.ZodObject<{
57
+ id: z.ZodString;
58
+ contentId: z.ZodString;
59
+ goalId: z.ZodNullable<z.ZodString>;
60
+ title: z.ZodString;
61
+ description: z.ZodNullable<z.ZodString>;
62
+ priority: z.ZodEnum<["high", "medium", "low"]>;
63
+ completed: z.ZodBoolean;
64
+ completedAt: z.ZodNullable<z.ZodString>;
65
+ createdAt: z.ZodString;
66
+ }, "strip", z.ZodTypeAny, {
67
+ id: string;
68
+ title: string;
69
+ description: string | null;
70
+ completed: boolean;
71
+ createdAt: string;
72
+ contentId: string;
73
+ goalId: string | null;
74
+ priority: "high" | "medium" | "low";
75
+ completedAt: string | null;
76
+ }, {
77
+ id: string;
78
+ title: string;
79
+ description: string | null;
80
+ completed: boolean;
81
+ createdAt: string;
82
+ contentId: string;
83
+ goalId: string | null;
84
+ priority: "high" | "medium" | "low";
85
+ completedAt: string | null;
86
+ }>;
87
+ export declare const GoalSchema: z.ZodObject<{
88
+ id: z.ZodString;
89
+ userId: z.ZodString;
90
+ title: z.ZodString;
91
+ description: z.ZodNullable<z.ZodString>;
92
+ category: z.ZodEnum<["health", "wealth", "relationships"]>;
93
+ isActive: z.ZodBoolean;
94
+ createdAt: z.ZodString;
95
+ }, "strip", z.ZodTypeAny, {
96
+ id: string;
97
+ userId: string;
98
+ title: string;
99
+ description: string | null;
100
+ createdAt: string;
101
+ category: "health" | "wealth" | "relationships";
102
+ isActive: boolean;
103
+ }, {
104
+ id: string;
105
+ userId: string;
106
+ title: string;
107
+ description: string | null;
108
+ createdAt: string;
109
+ category: "health" | "wealth" | "relationships";
110
+ isActive: boolean;
111
+ }>;
112
+ export type Content = z.infer<typeof ContentSchema>;
113
+ export type Action = z.infer<typeof ActionSchema>;
114
+ export type Goal = z.infer<typeof GoalSchema>;
115
+ export declare class NoverloadClient {
116
+ private config;
117
+ private headers;
118
+ constructor(config: ClientConfig);
119
+ initialize(): Promise<void>;
120
+ validateToken(): Promise<boolean>;
121
+ private request;
122
+ listContent(filters?: {
123
+ status?: string;
124
+ contentType?: string;
125
+ limit?: number;
126
+ }): Promise<Content[]>;
127
+ getContent(id: string): Promise<Content>;
128
+ saveContent(url: string): Promise<Content>;
129
+ listActions(filters?: {
130
+ contentId?: string;
131
+ goalId?: string;
132
+ completed?: boolean;
133
+ }): Promise<Action[]>;
134
+ completeAction(id: string): Promise<Action>;
135
+ listGoals(): Promise<Goal[]>;
136
+ searchContent(query: string, options?: {
137
+ tags?: string[];
138
+ }): Promise<Content[]>;
139
+ }
140
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;CACnB;AAGD,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgBxB,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUvB,CAAC;AAEH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;EAQrB,CAAC;AAEH,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AACpD,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAClD,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAE9C,qBAAa,eAAe;IAGd,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,OAAO,CAAyB;gBAEpB,MAAM,EAAE,YAAY;IAOlC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAS3B,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;YASzB,OAAO;IAef,WAAW,CAAC,OAAO,CAAC,EAAE;QAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAahB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQxC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiB1C,WAAW,CAAC,OAAO,CAAC,EAAE;QAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAef,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgB3C,SAAS,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAQ5B,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CA6CtF"}
package/dist/client.js ADDED
@@ -0,0 +1,190 @@
1
+ import { z } from "zod";
2
+ // Schema definitions matching your Noverload database
3
+ export const ContentSchema = z.object({
4
+ id: z.string(),
5
+ userId: z.string(),
6
+ url: z.string(),
7
+ title: z.string().nullable(),
8
+ description: z.string().nullable(),
9
+ contentType: z.enum(["youtube", "x_post", "reddit", "article", "pdf"]),
10
+ status: z.enum(["pending", "processing", "completed", "failed"]),
11
+ summary: z.any().nullable(), // Can be string or object
12
+ keyInsights: z.array(z.string()).nullable(),
13
+ rawText: z.string().nullable().optional(), // Full content text
14
+ ogImage: z.string().nullable().optional(),
15
+ processingMetadata: z.any().nullable().optional(),
16
+ tags: z.array(z.string()).optional(), // Associated tags
17
+ createdAt: z.string(),
18
+ updatedAt: z.string(),
19
+ });
20
+ export const ActionSchema = z.object({
21
+ id: z.string(),
22
+ contentId: z.string(),
23
+ goalId: z.string().nullable(),
24
+ title: z.string(),
25
+ description: z.string().nullable(),
26
+ priority: z.enum(["high", "medium", "low"]),
27
+ completed: z.boolean(),
28
+ completedAt: z.string().nullable(),
29
+ createdAt: z.string(),
30
+ });
31
+ export const GoalSchema = z.object({
32
+ id: z.string(),
33
+ userId: z.string(),
34
+ title: z.string(),
35
+ description: z.string().nullable(),
36
+ category: z.enum(["health", "wealth", "relationships"]),
37
+ isActive: z.boolean(),
38
+ createdAt: z.string(),
39
+ });
40
+ export class NoverloadClient {
41
+ config;
42
+ headers;
43
+ constructor(config) {
44
+ this.config = config;
45
+ this.headers = {
46
+ "Authorization": `Bearer ${config.accessToken}`,
47
+ "Content-Type": "application/json",
48
+ };
49
+ }
50
+ async initialize() {
51
+ // Verify the token is valid by making a test request
52
+ const response = await this.request("/api/user");
53
+ if (!response.ok) {
54
+ const errorText = await response.text().catch(() => "Unknown error");
55
+ throw new Error(`Invalid access token or API unavailable: ${response.status} - ${errorText}`);
56
+ }
57
+ }
58
+ async validateToken() {
59
+ try {
60
+ const response = await this.request("/api/user");
61
+ return response.ok;
62
+ }
63
+ catch {
64
+ return false;
65
+ }
66
+ }
67
+ async request(path, options = {}) {
68
+ const url = `${this.config.apiUrl}${path}`;
69
+ return fetch(url, {
70
+ ...options,
71
+ headers: {
72
+ ...this.headers,
73
+ ...options.headers,
74
+ },
75
+ });
76
+ }
77
+ // Content methods
78
+ async listContent(filters) {
79
+ const params = new URLSearchParams();
80
+ if (filters?.status)
81
+ params.append("status", filters.status);
82
+ if (filters?.contentType)
83
+ params.append("contentType", filters.contentType);
84
+ if (filters?.limit)
85
+ params.append("limit", filters.limit.toString());
86
+ const response = await this.request(`/api/mcp/content?${params}`);
87
+ if (!response.ok)
88
+ throw new Error("Failed to fetch content");
89
+ const data = await response.json();
90
+ return z.array(ContentSchema).parse(data);
91
+ }
92
+ async getContent(id) {
93
+ const response = await this.request(`/api/mcp/content/${id}`);
94
+ if (!response.ok)
95
+ throw new Error("Content not found");
96
+ const data = await response.json();
97
+ return ContentSchema.parse(data);
98
+ }
99
+ async saveContent(url) {
100
+ if (this.config.readOnly) {
101
+ throw new Error("Cannot save content in read-only mode");
102
+ }
103
+ const response = await this.request("/api/mcp/content", {
104
+ method: "POST",
105
+ body: JSON.stringify({ url }),
106
+ });
107
+ if (!response.ok)
108
+ throw new Error("Failed to save content");
109
+ const data = await response.json();
110
+ return ContentSchema.parse(data);
111
+ }
112
+ // Action methods
113
+ async listActions(filters) {
114
+ const params = new URLSearchParams();
115
+ if (filters?.contentId)
116
+ params.append("contentId", filters.contentId);
117
+ if (filters?.goalId)
118
+ params.append("goalId", filters.goalId);
119
+ if (filters?.completed !== undefined) {
120
+ params.append("completed", filters.completed.toString());
121
+ }
122
+ const response = await this.request(`/api/mcp/actions?${params}`);
123
+ if (!response.ok)
124
+ throw new Error("Failed to fetch actions");
125
+ const data = await response.json();
126
+ return z.array(ActionSchema).parse(data);
127
+ }
128
+ async completeAction(id) {
129
+ if (this.config.readOnly) {
130
+ throw new Error("Cannot complete action in read-only mode");
131
+ }
132
+ const response = await this.request(`/api/mcp/actions/${id}/complete`, {
133
+ method: "POST",
134
+ });
135
+ if (!response.ok)
136
+ throw new Error("Failed to complete action");
137
+ const data = await response.json();
138
+ return ActionSchema.parse(data);
139
+ }
140
+ // Goal methods
141
+ async listGoals() {
142
+ const response = await this.request("/api/mcp/goals");
143
+ if (!response.ok)
144
+ throw new Error("Failed to fetch goals");
145
+ const data = await response.json();
146
+ return z.array(GoalSchema).parse(data);
147
+ }
148
+ async searchContent(query, options) {
149
+ // Use the vector-powered search endpoint
150
+ const response = await this.request(`/api/mcp/search/vector`, {
151
+ method: "POST",
152
+ body: JSON.stringify({
153
+ query,
154
+ limit: 20,
155
+ useHybrid: true, // Use both vector and text search
156
+ minSimilarity: 0.25, // Lower threshold for better recall
157
+ tags: options?.tags // Optional tag filter
158
+ }),
159
+ });
160
+ if (!response.ok) {
161
+ const errorText = await response.text().catch(() => "Unknown error");
162
+ console.error(`Search failed: ${response.status} - ${errorText}`);
163
+ throw new Error("Search failed");
164
+ }
165
+ const data = await response.json();
166
+ // Map the search results to MCP format with full content
167
+ if (data?.results && Array.isArray(data.results)) {
168
+ return data.results.map((item) => ({
169
+ id: item.id,
170
+ userId: item.userId || "",
171
+ url: item.url || "",
172
+ title: item.title,
173
+ description: item.description || (item.summary ? String(item.summary).slice(0, 500) : ""),
174
+ contentType: item.contentType || "article",
175
+ status: item.status || "completed",
176
+ summary: item.summary,
177
+ keyInsights: item.keyInsights || [],
178
+ rawText: item.rawText || null, // Include full content
179
+ ogImage: item.ogImage || null,
180
+ processingMetadata: item.processingMetadata || null,
181
+ tags: item.tags || [], // Include tags
182
+ createdAt: item.createdAt || new Date().toISOString(),
183
+ updatedAt: item.updatedAt || new Date().toISOString(),
184
+ }));
185
+ }
186
+ console.warn("No results found in search response");
187
+ return [];
188
+ }
189
+ }
190
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,86 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { CallToolRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema, ReadResourceRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
5
+ import { z } from "zod";
6
+ import { NoverloadClient } from "./client.js";
7
+ import { tools } from "./tools/index.js";
8
+ import { resources } from "./resources/index.js";
9
+ const ConfigSchema = z.object({
10
+ accessToken: z.string().min(1, "Access token is required"),
11
+ apiUrl: z.string().url().optional().default("https://noverload.app"),
12
+ readOnly: z.boolean().optional().default(true),
13
+ });
14
+ async function main() {
15
+ const transport = new StdioServerTransport();
16
+ const server = new Server({
17
+ name: "noverload-mcp",
18
+ version: "0.1.0",
19
+ }, {
20
+ capabilities: {
21
+ tools: {},
22
+ resources: {},
23
+ },
24
+ });
25
+ let client = null;
26
+ let config = null;
27
+ // Initialize with config from environment or args
28
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
29
+ if (!client) {
30
+ const rawConfig = process.env.NOVERLOAD_CONFIG || process.argv[2];
31
+ if (!rawConfig) {
32
+ throw new Error("Configuration required. Set NOVERLOAD_CONFIG environment variable.");
33
+ }
34
+ try {
35
+ config = ConfigSchema.parse(JSON.parse(rawConfig));
36
+ client = new NoverloadClient(config);
37
+ await client.initialize();
38
+ }
39
+ catch (error) {
40
+ throw new Error(`Invalid configuration: ${error}`);
41
+ }
42
+ }
43
+ return {
44
+ tools: tools.map(tool => ({
45
+ name: tool.name,
46
+ description: tool.description,
47
+ inputSchema: tool.inputSchema,
48
+ })),
49
+ };
50
+ });
51
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
52
+ if (!client) {
53
+ throw new Error("Client not initialized");
54
+ }
55
+ const tool = tools.find(t => t.name === request.params.name);
56
+ if (!tool) {
57
+ throw new Error(`Unknown tool: ${request.params.name}`);
58
+ }
59
+ if (config?.readOnly && tool.modifies) {
60
+ throw new Error(`Tool ${request.params.name} modifies data but server is in read-only mode`);
61
+ }
62
+ return await tool.handler(client, request.params.arguments);
63
+ });
64
+ server.setRequestHandler(ListResourcesRequestSchema, async () => {
65
+ if (!client) {
66
+ throw new Error("Client not initialized");
67
+ }
68
+ const resourceList = await resources.list(client);
69
+ return {
70
+ resources: resourceList,
71
+ };
72
+ });
73
+ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
74
+ if (!client) {
75
+ throw new Error("Client not initialized");
76
+ }
77
+ return await resources.read(client, request.params.uri);
78
+ });
79
+ await server.connect(transport);
80
+ console.error("Noverload MCP Server running");
81
+ }
82
+ main().catch((error) => {
83
+ console.error("Fatal error:", error);
84
+ process.exit(1);
85
+ });
86
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { NoverloadClient } from "../client.js";
2
+ export declare const resources: {
3
+ list(client: NoverloadClient): Promise<{
4
+ uri: string;
5
+ name: string;
6
+ description: any;
7
+ mimeType: string;
8
+ }[]>;
9
+ read(client: NoverloadClient, uri: string): Promise<{
10
+ contents: Array<{
11
+ uri: string;
12
+ mimeType: string;
13
+ text: string;
14
+ }>;
15
+ }>;
16
+ };
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAW,MAAM,cAAc,CAAC;AAExD,eAAO,MAAM,SAAS;iBACD,eAAe;;;;;;iBAcf,eAAe,OAAO,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,KAAK,CAAC;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;CAiChI,CAAC"}
@@ -0,0 +1,42 @@
1
+ export const resources = {
2
+ async list(client) {
3
+ const content = await client.listContent({
4
+ status: "completed",
5
+ limit: 100
6
+ });
7
+ return content.map((item) => ({
8
+ uri: `noverload://content/${item.id}`,
9
+ name: item.title || `${item.contentType} - ${item.id}`,
10
+ description: item.description || item.summary || "Saved content",
11
+ mimeType: "application/json",
12
+ }));
13
+ },
14
+ async read(client, uri) {
15
+ const match = uri.match(/^noverload:\/\/content\/(.+)$/);
16
+ if (!match) {
17
+ throw new Error(`Invalid resource URI: ${uri}`);
18
+ }
19
+ const contentId = match[1];
20
+ const content = await client.getContent(contentId);
21
+ const actions = await client.listActions({ contentId });
22
+ return {
23
+ contents: [
24
+ {
25
+ uri,
26
+ mimeType: "application/json",
27
+ text: JSON.stringify({
28
+ content,
29
+ actions,
30
+ metadata: {
31
+ url: content.url,
32
+ type: content.contentType,
33
+ processed: content.status === "completed",
34
+ insights: content.keyInsights,
35
+ },
36
+ }, null, 2),
37
+ },
38
+ ],
39
+ };
40
+ },
41
+ };
42
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,KAAK,CAAC,IAAI,CAAC,MAAuB;QAChC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC;YACvC,MAAM,EAAE,WAAW;YACnB,KAAK,EAAE,GAAG;SACX,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,IAAa,EAAE,EAAE,CAAC,CAAC;YACrC,GAAG,EAAE,uBAAuB,IAAI,CAAC,EAAE,EAAE;YACrC,IAAI,EAAE,IAAI,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC,WAAW,MAAM,IAAI,CAAC,EAAE,EAAE;YACtD,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,IAAI,eAAe;YAChE,QAAQ,EAAE,kBAAkB;SAC7B,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAuB,EAAE,GAAW;QAC7C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACzD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;QAExD,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG;oBACH,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;wBACE,OAAO;wBACP,OAAO;wBACP,QAAQ,EAAE;4BACR,GAAG,EAAE,OAAO,CAAC,GAAG;4BAChB,IAAI,EAAE,OAAO,CAAC,WAAW;4BACzB,SAAS,EAAE,OAAO,CAAC,MAAM,KAAK,WAAW;4BACzC,QAAQ,EAAE,OAAO,CAAC,WAAW;yBAC9B;qBACF,EACD,IAAI,EACJ,CAAC,CACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { NoverloadClient } from "../client.js";
2
+ export interface Tool {
3
+ name: string;
4
+ description: string;
5
+ inputSchema: Record<string, unknown>;
6
+ modifies: boolean;
7
+ handler: (client: NoverloadClient, args: unknown) => Promise<{
8
+ content: Array<{
9
+ type: string;
10
+ text: string;
11
+ }>;
12
+ data?: unknown;
13
+ }>;
14
+ }
15
+ export declare const tools: Tool[];
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAClI;AAED,eAAO,MAAM,KAAK,EAAE,IAAI,EAmYvB,CAAC"}
@@ -0,0 +1,366 @@
1
+ import { z } from "zod";
2
+ export const tools = [
3
+ {
4
+ name: "list_saved_content",
5
+ description: "List saved content from Noverload with full details including titles, summaries, and insights. Optionally filter by status or content type.",
6
+ inputSchema: {
7
+ type: "object",
8
+ properties: {
9
+ status: {
10
+ type: "string",
11
+ enum: ["pending", "processing", "completed", "failed"],
12
+ description: "Filter by processing status",
13
+ },
14
+ contentType: {
15
+ type: "string",
16
+ enum: ["youtube", "x_post", "reddit", "article", "pdf"],
17
+ description: "Filter by content type",
18
+ },
19
+ limit: {
20
+ type: "number",
21
+ description: "Maximum number of items to return",
22
+ default: 20,
23
+ },
24
+ },
25
+ },
26
+ modifies: false,
27
+ handler: async (client, args) => {
28
+ const schema = z.object({
29
+ status: z.enum(["pending", "processing", "completed", "failed"]).optional(),
30
+ contentType: z.enum(["youtube", "x_post", "reddit", "article", "pdf"]).optional(),
31
+ limit: z.number().optional().default(20),
32
+ });
33
+ const params = schema.parse(args);
34
+ const content = await client.listContent(params);
35
+ // Build detailed response
36
+ let responseText = `# Saved Content Library\n`;
37
+ responseText += `Found ${content.length} items`;
38
+ const filters = [];
39
+ if (params.status)
40
+ filters.push(`status: ${params.status}`);
41
+ if (params.contentType)
42
+ filters.push(`type: ${params.contentType}`);
43
+ if (filters.length > 0) {
44
+ responseText += ` (filtered by ${filters.join(', ')})`;
45
+ }
46
+ responseText += `\n\n`;
47
+ if (content.length > 0) {
48
+ content.forEach((item, idx) => {
49
+ responseText += `## ${idx + 1}. ${item.title || 'Untitled'}\n`;
50
+ responseText += `**Type:** ${item.contentType} | **Status:** ${item.status}\n`;
51
+ responseText += `**URL:** ${item.url}\n`;
52
+ if (item.summary) {
53
+ const summaryObj = typeof item.summary === 'string'
54
+ ? { text: item.summary }
55
+ : item.summary;
56
+ if (summaryObj.one_sentence) {
57
+ responseText += `**Summary:** ${summaryObj.one_sentence}\n`;
58
+ }
59
+ }
60
+ responseText += `**Saved:** ${new Date(item.createdAt).toLocaleDateString()}\n`;
61
+ responseText += '\n---\n\n';
62
+ });
63
+ }
64
+ else {
65
+ responseText += "No content found matching the specified filters.";
66
+ }
67
+ return {
68
+ content: [
69
+ {
70
+ type: "text",
71
+ text: responseText,
72
+ },
73
+ ],
74
+ data: content,
75
+ };
76
+ },
77
+ },
78
+ {
79
+ name: "get_content_details",
80
+ description: "Get complete details about a specific saved content item including full transcript/article text, AI-generated summary, key insights, and all metadata",
81
+ inputSchema: {
82
+ type: "object",
83
+ properties: {
84
+ contentId: {
85
+ type: "string",
86
+ description: "The ID of the content to retrieve",
87
+ },
88
+ },
89
+ required: ["contentId"],
90
+ },
91
+ modifies: false,
92
+ handler: async (client, args) => {
93
+ const schema = z.object({
94
+ contentId: z.string(),
95
+ });
96
+ const { contentId } = schema.parse(args);
97
+ const content = await client.getContent(contentId);
98
+ // Build comprehensive response with all details
99
+ let responseText = `# Content Details: ${content.title || 'Untitled'}\n\n`;
100
+ responseText += `**ID:** ${content.id}\n`;
101
+ responseText += `**Type:** ${content.contentType}\n`;
102
+ responseText += `**Status:** ${content.status}\n`;
103
+ responseText += `**URL:** ${content.url}\n`;
104
+ responseText += `**Saved:** ${new Date(content.createdAt).toLocaleDateString()}\n`;
105
+ if (content.tags && content.tags.length > 0) {
106
+ responseText += `**Tags:** ${content.tags.join(', ')}\n`;
107
+ }
108
+ responseText += '\n## Summary & Insights\n';
109
+ if (content.summary) {
110
+ const summaryObj = typeof content.summary === 'string'
111
+ ? { text: content.summary }
112
+ : content.summary;
113
+ if (summaryObj.one_sentence) {
114
+ responseText += `**One-line Summary:** ${summaryObj.one_sentence}\n\n`;
115
+ }
116
+ if (summaryObj.key_insights && Array.isArray(summaryObj.key_insights)) {
117
+ responseText += `**Key Insights:**\n`;
118
+ summaryObj.key_insights.forEach((insight, idx) => {
119
+ responseText += `${idx + 1}. ${insight}\n`;
120
+ });
121
+ responseText += '\n';
122
+ }
123
+ if (summaryObj.main_topics && Array.isArray(summaryObj.main_topics)) {
124
+ responseText += `**Main Topics:** ${summaryObj.main_topics.join(', ')}\n\n`;
125
+ }
126
+ if (summaryObj.actionable_takeaways && Array.isArray(summaryObj.actionable_takeaways)) {
127
+ responseText += `**Actionable Takeaways:**\n`;
128
+ summaryObj.actionable_takeaways.forEach((takeaway, idx) => {
129
+ responseText += `${idx + 1}. ${takeaway}\n`;
130
+ });
131
+ responseText += '\n';
132
+ }
133
+ }
134
+ // Include full text content preview
135
+ if (content.rawText) {
136
+ const wordCount = content.rawText.split(/\s+/).length;
137
+ responseText += `## Full Content\n`;
138
+ responseText += `**Word Count:** ${wordCount} words\n`;
139
+ responseText += `**Preview (first 1000 chars):**\n`;
140
+ responseText += `${content.rawText.slice(0, 1000)}...\n\n`;
141
+ responseText += `*Note: Complete transcript/article text (${wordCount} words) is available in the data field for full analysis.*\n`;
142
+ }
143
+ return {
144
+ content: [
145
+ {
146
+ type: "text",
147
+ text: responseText,
148
+ },
149
+ ],
150
+ data: content, // Full content including complete rawText
151
+ };
152
+ },
153
+ },
154
+ {
155
+ name: "search_content",
156
+ description: "Search through saved content by keywords using vector embeddings and semantic search. Returns full content details including summaries, key insights, and raw text. Optionally filter by tags.",
157
+ inputSchema: {
158
+ type: "object",
159
+ properties: {
160
+ query: {
161
+ type: "string",
162
+ description: "Search query",
163
+ },
164
+ tags: {
165
+ type: "array",
166
+ items: {
167
+ type: "string",
168
+ },
169
+ description: "Optional list of tags to filter by (e.g., ['productivity', 'AI', 'marketing'])",
170
+ },
171
+ limit: {
172
+ type: "number",
173
+ description: "Maximum number of results to return (default: 10)",
174
+ default: 10,
175
+ },
176
+ },
177
+ required: ["query"],
178
+ },
179
+ modifies: false,
180
+ handler: async (client, args) => {
181
+ const schema = z.object({
182
+ query: z.string(),
183
+ tags: z.array(z.string()).optional(),
184
+ limit: z.number().optional().default(10),
185
+ });
186
+ const { query, tags, limit } = schema.parse(args);
187
+ const results = await client.searchContent(query, { tags });
188
+ // Limit results
189
+ const limitedResults = results.slice(0, limit);
190
+ // Build comprehensive response with actual content
191
+ let responseText = `# Search Results: "${query}"\n`;
192
+ responseText += `Found ${results.length} total results`;
193
+ if (tags && tags.length > 0) {
194
+ responseText += ` (filtered by tags: ${tags.join(', ')})`;
195
+ }
196
+ responseText += `. Showing top ${limitedResults.length}.\n\n`;
197
+ if (limitedResults.length > 0) {
198
+ limitedResults.forEach((result, idx) => {
199
+ responseText += `## ${idx + 1}. ${result.title || 'Untitled'}\n`;
200
+ responseText += `**Type:** ${result.contentType} | **URL:** ${result.url}\n`;
201
+ if (result.tags && result.tags.length > 0) {
202
+ responseText += `**Tags:** ${result.tags.join(', ')}\n`;
203
+ }
204
+ // Include summary if available
205
+ if (result.summary) {
206
+ const summaryObj = typeof result.summary === 'string'
207
+ ? { text: result.summary }
208
+ : result.summary;
209
+ if (summaryObj.one_sentence) {
210
+ responseText += `**Summary:** ${summaryObj.one_sentence}\n`;
211
+ }
212
+ if (summaryObj.key_insights && Array.isArray(summaryObj.key_insights)) {
213
+ responseText += `**Key Insights:**\n`;
214
+ summaryObj.key_insights.slice(0, 3).forEach((insight) => {
215
+ responseText += `- ${insight}\n`;
216
+ });
217
+ }
218
+ }
219
+ // Include a preview of raw text if available
220
+ if (result.rawText) {
221
+ const preview = result.rawText.slice(0, 500).replace(/\n+/g, ' ');
222
+ responseText += `**Content Preview:** ${preview}...\n`;
223
+ }
224
+ responseText += '\n---\n\n';
225
+ });
226
+ responseText += `\n*Note: Full content text is available in the data field for detailed analysis.*`;
227
+ }
228
+ else {
229
+ responseText += "\nNo results found. Try adjusting your search query or filters.";
230
+ }
231
+ return {
232
+ content: [
233
+ {
234
+ type: "text",
235
+ text: responseText,
236
+ },
237
+ ],
238
+ data: limitedResults, // Include full data for AI to analyze
239
+ };
240
+ },
241
+ },
242
+ {
243
+ name: "save_content",
244
+ description: "Save a new URL to Noverload for processing",
245
+ inputSchema: {
246
+ type: "object",
247
+ properties: {
248
+ url: {
249
+ type: "string",
250
+ description: "URL to save (YouTube, X/Twitter, Reddit, article, or PDF)",
251
+ },
252
+ },
253
+ required: ["url"],
254
+ },
255
+ modifies: true,
256
+ handler: async (client, args) => {
257
+ const schema = z.object({
258
+ url: z.string().url(),
259
+ });
260
+ const { url } = schema.parse(args);
261
+ const content = await client.saveContent(url);
262
+ return {
263
+ content: [
264
+ {
265
+ type: "text",
266
+ text: content.title ? `Saved: ${content.title}` : `Saved content from: ${new URL(url).hostname}`,
267
+ },
268
+ ],
269
+ data: content,
270
+ };
271
+ },
272
+ },
273
+ {
274
+ name: "list_actions",
275
+ description: "List action items extracted from saved content",
276
+ inputSchema: {
277
+ type: "object",
278
+ properties: {
279
+ contentId: {
280
+ type: "string",
281
+ description: "Filter by content ID",
282
+ },
283
+ goalId: {
284
+ type: "string",
285
+ description: "Filter by goal ID",
286
+ },
287
+ completed: {
288
+ type: "boolean",
289
+ description: "Filter by completion status",
290
+ },
291
+ },
292
+ },
293
+ modifies: false,
294
+ handler: async (client, args) => {
295
+ const schema = z.object({
296
+ contentId: z.string().optional(),
297
+ goalId: z.string().optional(),
298
+ completed: z.boolean().optional(),
299
+ });
300
+ const params = schema.parse(args);
301
+ const actions = await client.listActions(params);
302
+ return {
303
+ content: [
304
+ {
305
+ type: "text",
306
+ text: `Found ${actions.length} actions`,
307
+ },
308
+ ],
309
+ data: actions,
310
+ };
311
+ },
312
+ },
313
+ {
314
+ name: "complete_action",
315
+ description: "Mark an action item as completed",
316
+ inputSchema: {
317
+ type: "object",
318
+ properties: {
319
+ actionId: {
320
+ type: "string",
321
+ description: "The ID of the action to complete",
322
+ },
323
+ },
324
+ required: ["actionId"],
325
+ },
326
+ modifies: true,
327
+ handler: async (client, args) => {
328
+ const schema = z.object({
329
+ actionId: z.string(),
330
+ });
331
+ const { actionId } = schema.parse(args);
332
+ const action = await client.completeAction(actionId);
333
+ return {
334
+ content: [
335
+ {
336
+ type: "text",
337
+ text: `Completed action: ${action.title}`,
338
+ },
339
+ ],
340
+ data: action,
341
+ };
342
+ },
343
+ },
344
+ {
345
+ name: "list_goals",
346
+ description: "List user's goals (Health, Wealth, Relationships)",
347
+ inputSchema: {
348
+ type: "object",
349
+ properties: {},
350
+ },
351
+ modifies: false,
352
+ handler: async (client) => {
353
+ const goals = await client.listGoals();
354
+ return {
355
+ content: [
356
+ {
357
+ type: "text",
358
+ text: `Found ${goals.length} goals`,
359
+ },
360
+ ],
361
+ data: goals,
362
+ };
363
+ },
364
+ },
365
+ ];
366
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "noverload-mcp",
3
+ "version": "0.1.0",
4
+ "description": "MCP server for Noverload - Access saved content in AI tools",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "noverload-mcp": "dist/index.js"
10
+ },
11
+ "keywords": [
12
+ "mcp",
13
+ "model-context-protocol",
14
+ "ai",
15
+ "claude",
16
+ "cursor",
17
+ "windsurf",
18
+ "noverload",
19
+ "knowledge-management"
20
+ ],
21
+ "author": "Noverload",
22
+ "license": "MIT",
23
+ "homepage": "https://github.com/noverload/mcp-server",
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "git+https://github.com/noverload/mcp-server.git"
27
+ },
28
+ "bugs": {
29
+ "url": "https://github.com/noverload/mcp-server/issues"
30
+ },
31
+ "scripts": {
32
+ "build": "tsc",
33
+ "dev": "tsx watch src/index.ts",
34
+ "start": "node dist/index.js",
35
+ "typecheck": "tsc --noEmit",
36
+ "test": "vitest"
37
+ },
38
+ "dependencies": {
39
+ "@modelcontextprotocol/sdk": "^0.6.0",
40
+ "zod": "^3.22.0"
41
+ },
42
+ "devDependencies": {
43
+ "@types/node": "^20.0.0",
44
+ "tsx": "^4.0.0",
45
+ "typescript": "^5.0.0",
46
+ "vitest": "^1.0.0"
47
+ },
48
+ "files": [
49
+ "dist",
50
+ "README.md"
51
+ ],
52
+ "publishConfig": {
53
+ "access": "public"
54
+ }
55
+ }