@parasite2060/jarvis-mcp-server 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/__tests__/jarvis-client.test.d.ts +2 -0
  2. package/dist/__tests__/jarvis-client.test.d.ts.map +1 -0
  3. package/dist/__tests__/jarvis-client.test.js +88 -0
  4. package/dist/__tests__/jarvis-client.test.js.map +1 -0
  5. package/dist/__tests__/memory-add.test.d.ts +2 -0
  6. package/dist/__tests__/memory-add.test.d.ts.map +1 -0
  7. package/dist/__tests__/memory-add.test.js +67 -0
  8. package/dist/__tests__/memory-add.test.js.map +1 -0
  9. package/dist/__tests__/memory-search.test.d.ts +2 -0
  10. package/dist/__tests__/memory-search.test.d.ts.map +1 -0
  11. package/dist/__tests__/memory-search.test.js +95 -0
  12. package/dist/__tests__/memory-search.test.js.map +1 -0
  13. package/dist/__tests__/tools.test.d.ts +2 -0
  14. package/dist/__tests__/tools.test.d.ts.map +1 -0
  15. package/dist/__tests__/tools.test.js +52 -0
  16. package/dist/__tests__/tools.test.js.map +1 -0
  17. package/dist/index.d.ts +3 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +15 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/lib/jarvis-client.d.ts +10 -0
  22. package/dist/lib/jarvis-client.d.ts.map +1 -0
  23. package/dist/lib/jarvis-client.js +73 -0
  24. package/dist/lib/jarvis-client.js.map +1 -0
  25. package/dist/schemas.d.ts +19 -0
  26. package/dist/schemas.d.ts.map +1 -0
  27. package/dist/schemas.js +9 -0
  28. package/dist/schemas.js.map +1 -0
  29. package/dist/tools/memory-add.d.ts +7 -0
  30. package/dist/tools/memory-add.d.ts.map +1 -0
  31. package/dist/tools/memory-add.js +10 -0
  32. package/dist/tools/memory-add.js.map +1 -0
  33. package/dist/tools/memory-search.d.ts +7 -0
  34. package/dist/tools/memory-search.d.ts.map +1 -0
  35. package/dist/tools/memory-search.js +22 -0
  36. package/dist/tools/memory-search.js.map +1 -0
  37. package/dist/types.d.ts +22 -0
  38. package/dist/types.d.ts.map +1 -0
  39. package/dist/types.js +2 -0
  40. package/dist/types.js.map +1 -0
  41. package/package.json +36 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=jarvis-client.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jarvis-client.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/jarvis-client.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,88 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ const mockFetch = vi.fn();
3
+ vi.stubGlobal('fetch', mockFetch);
4
+ const { jarvisPost, jarvisGet } = await import('../lib/jarvis-client.js');
5
+ beforeEach(() => {
6
+ mockFetch.mockReset();
7
+ });
8
+ describe('jarvisPost', () => {
9
+ it('returns ok with data on 200 response', async () => {
10
+ mockFetch.mockResolvedValueOnce({
11
+ ok: true,
12
+ json: async () => ({ data: { results: [] }, status: 'ok' }),
13
+ });
14
+ const result = await jarvisPost('/memory/search', { query: 'test' });
15
+ expect(result).toEqual({ ok: true, data: { data: { results: [] }, status: 'ok' } });
16
+ });
17
+ it('returns error with extracted message on 4xx/5xx', async () => {
18
+ mockFetch.mockResolvedValueOnce({
19
+ ok: false,
20
+ status: 500,
21
+ json: async () => ({ error: { code: 'MEMU_ERROR', message: 'search failed' }, status: 'error' }),
22
+ });
23
+ const result = await jarvisPost('/memory/search', { query: 'test' });
24
+ expect(result).toEqual({ ok: false, error: 'Server error: MEMU_ERROR - search failed' });
25
+ });
26
+ it('returns error with HTTP status when body has no error details', async () => {
27
+ mockFetch.mockResolvedValueOnce({
28
+ ok: false,
29
+ status: 404,
30
+ json: async () => ({ message: 'not found' }),
31
+ });
32
+ const result = await jarvisPost('/test', {});
33
+ expect(result).toEqual({ ok: false, error: 'Server error: HTTP 404' });
34
+ });
35
+ it('returns error with HTTP status when body is not JSON', async () => {
36
+ mockFetch.mockResolvedValueOnce({
37
+ ok: false,
38
+ status: 502,
39
+ json: async () => { throw new Error('not JSON'); },
40
+ });
41
+ const result = await jarvisPost('/test', {});
42
+ expect(result).toEqual({ ok: false, error: 'Server error: HTTP 502' });
43
+ });
44
+ it('returns unreachable error on network failure', async () => {
45
+ mockFetch.mockRejectedValueOnce(new Error('ECONNREFUSED'));
46
+ const result = await jarvisPost('/memory/search', { query: 'test' });
47
+ expect(result).toEqual({ ok: false, error: 'Jarvis server unreachable: ECONNREFUSED' });
48
+ });
49
+ it('sends correct headers and body', async () => {
50
+ mockFetch.mockResolvedValueOnce({
51
+ ok: true,
52
+ json: async () => ({ status: 'ok' }),
53
+ });
54
+ await jarvisPost('/memory/add', { content: 'hello' });
55
+ expect(mockFetch).toHaveBeenCalledWith('http://localhost:8000/memory/add', expect.objectContaining({
56
+ method: 'POST',
57
+ body: JSON.stringify({ content: 'hello' }),
58
+ headers: expect.objectContaining({
59
+ 'Content-Type': 'application/json',
60
+ }),
61
+ }));
62
+ });
63
+ });
64
+ describe('jarvisGet', () => {
65
+ it('returns ok with data on 200 response', async () => {
66
+ mockFetch.mockResolvedValueOnce({
67
+ ok: true,
68
+ json: async () => ({ data: { health: 'ok' }, status: 'ok' }),
69
+ });
70
+ const result = await jarvisGet('/health');
71
+ expect(result).toEqual({ ok: true, data: { data: { health: 'ok' }, status: 'ok' } });
72
+ });
73
+ it('returns error with extracted message on 4xx/5xx', async () => {
74
+ mockFetch.mockResolvedValueOnce({
75
+ ok: false,
76
+ status: 403,
77
+ json: async () => ({ error: { code: 'UNAUTHORIZED', message: 'bad key' }, status: 'error' }),
78
+ });
79
+ const result = await jarvisGet('/health');
80
+ expect(result).toEqual({ ok: false, error: 'Server error: UNAUTHORIZED - bad key' });
81
+ });
82
+ it('returns unreachable error on network failure', async () => {
83
+ mockFetch.mockRejectedValueOnce(new Error('ECONNREFUSED'));
84
+ const result = await jarvisGet('/health');
85
+ expect(result).toEqual({ ok: false, error: 'Jarvis server unreachable: ECONNREFUSED' });
86
+ });
87
+ });
88
+ //# sourceMappingURL=jarvis-client.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jarvis-client.test.js","sourceRoot":"","sources":["../../src/__tests__/jarvis-client.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=memory-add.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-add.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/memory-add.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,67 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ vi.mock('../lib/jarvis-client.js', () => ({
3
+ jarvisPost: vi.fn(),
4
+ }));
5
+ const { jarvisPost } = await import('../lib/jarvis-client.js');
6
+ const { handleMemoryAdd } = await import('../tools/memory-add.js');
7
+ const mockJarvisPost = vi.mocked(jarvisPost);
8
+ beforeEach(() => {
9
+ mockJarvisPost.mockReset();
10
+ });
11
+ describe('handleMemoryAdd', () => {
12
+ it('returns confirmation with memory ID on success', async () => {
13
+ mockJarvisPost.mockResolvedValueOnce({
14
+ ok: true,
15
+ data: { data: { memoryId: 'mem-123', status: 'accepted' }, status: 'ok' },
16
+ });
17
+ const result = await handleMemoryAdd('Use async everywhere', 'coding standard');
18
+ expect(result.content[0].text).toBe('Memory stored successfully (ID: mem-123)');
19
+ });
20
+ it('returns error message when server unreachable', async () => {
21
+ mockJarvisPost.mockResolvedValueOnce({
22
+ ok: false,
23
+ error: 'Jarvis server unreachable: ECONNREFUSED',
24
+ });
25
+ const result = await handleMemoryAdd('test content');
26
+ expect(result.content[0].text).toBe('Jarvis server unreachable: ECONNREFUSED');
27
+ });
28
+ it('returns error message when server returns error', async () => {
29
+ mockJarvisPost.mockResolvedValueOnce({
30
+ ok: false,
31
+ error: 'Server error: MEMU_ERROR - storage failed',
32
+ });
33
+ const result = await handleMemoryAdd('test content');
34
+ expect(result.content[0].text).toBe('Server error: MEMU_ERROR - storage failed');
35
+ });
36
+ it('calls jarvisPost with correct path and body including context', async () => {
37
+ mockJarvisPost.mockResolvedValueOnce({
38
+ ok: true,
39
+ data: { data: { memoryId: 'mem-456', status: 'accepted' }, status: 'ok' },
40
+ });
41
+ await handleMemoryAdd('my memory', 'some context');
42
+ expect(mockJarvisPost).toHaveBeenCalledWith('/memory/add', {
43
+ content: 'my memory',
44
+ metadata: { context: 'some context' },
45
+ });
46
+ });
47
+ it('calls jarvisPost with undefined context when not provided', async () => {
48
+ mockJarvisPost.mockResolvedValueOnce({
49
+ ok: true,
50
+ data: { data: { memoryId: 'mem-789', status: 'accepted' }, status: 'ok' },
51
+ });
52
+ await handleMemoryAdd('my memory');
53
+ expect(mockJarvisPost).toHaveBeenCalledWith('/memory/add', {
54
+ content: 'my memory',
55
+ metadata: { context: undefined },
56
+ });
57
+ });
58
+ it('handles missing memoryId in response gracefully', async () => {
59
+ mockJarvisPost.mockResolvedValueOnce({
60
+ ok: true,
61
+ data: { data: { status: 'accepted' }, status: 'ok' },
62
+ });
63
+ const result = await handleMemoryAdd('test');
64
+ expect(result.content[0].text).toBe('Memory stored successfully (ID: unknown)');
65
+ });
66
+ });
67
+ //# sourceMappingURL=memory-add.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-add.test.js","sourceRoot":"","sources":["../../src/__tests__/memory-add.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAG9D,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAAC,CAAC;IACxC,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;CACpB,CAAC,CAAC,CAAC;AAEJ,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;AAC/D,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;AACnE,MAAM,cAAc,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AAE7C,UAAU,CAAC,GAAG,EAAE;IACd,cAAc,CAAC,SAAS,EAAE,CAAC;AAC7B,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,cAAc,CAAC,qBAAqB,CAAC;YACnC,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;SACjD,CAAC,CAAC;QAE5B,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,sBAAsB,EAAE,iBAAiB,CAAC,CAAC;QAChF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,cAAc,CAAC,qBAAqB,CAAC;YACnC,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,yCAAyC;SACxB,CAAC,CAAC;QAE5B,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,cAAc,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,cAAc,CAAC,qBAAqB,CAAC;YACnC,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,2CAA2C;SAC1B,CAAC,CAAC;QAE5B,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,cAAc,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,cAAc,CAAC,qBAAqB,CAAC;YACnC,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;SACjD,CAAC,CAAC;QAE5B,MAAM,eAAe,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QACnD,MAAM,CAAC,cAAc,CAAC,CAAC,oBAAoB,CAAC,aAAa,EAAE;YACzD,OAAO,EAAE,WAAW;YACpB,QAAQ,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE;SACtC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,cAAc,CAAC,qBAAqB,CAAC;YACnC,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;SACjD,CAAC,CAAC;QAE5B,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;QACnC,MAAM,CAAC,cAAc,CAAC,CAAC,oBAAoB,CAAC,aAAa,EAAE;YACzD,OAAO,EAAE,WAAW;YACpB,QAAQ,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE;SACjC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,cAAc,CAAC,qBAAqB,CAAC;YACnC,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;SAC5B,CAAC,CAAC;QAE5B,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=memory-search.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-search.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/memory-search.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,95 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ vi.mock('../lib/jarvis-client.js', () => ({
3
+ jarvisPost: vi.fn(),
4
+ }));
5
+ const { jarvisPost } = await import('../lib/jarvis-client.js');
6
+ const { handleMemorySearch } = await import('../tools/memory-search.js');
7
+ const mockJarvisPost = vi.mocked(jarvisPost);
8
+ beforeEach(() => {
9
+ mockJarvisPost.mockReset();
10
+ });
11
+ describe('handleMemorySearch', () => {
12
+ it('formats successful results with relevance and source', async () => {
13
+ mockJarvisPost.mockResolvedValueOnce({
14
+ ok: true,
15
+ data: {
16
+ data: {
17
+ results: [
18
+ { content: 'Use async/await everywhere', relevance: 0.95, source: 'decisions/async.md' },
19
+ { content: 'Prefer httpx over requests', relevance: 0.82, source: 'MEMORY.md' },
20
+ ],
21
+ query: 'async patterns',
22
+ method: 'rag',
23
+ },
24
+ status: 'ok',
25
+ },
26
+ });
27
+ const result = await handleMemorySearch('async patterns');
28
+ const text = result.content[0].text;
29
+ expect(text).toContain('Found 2 memories matching "async patterns"');
30
+ expect(text).toContain('[Relevance: 0.95]');
31
+ expect(text).toContain('Use async/await everywhere');
32
+ expect(text).toContain('Source: decisions/async.md');
33
+ expect(text).toContain('[Relevance: 0.82]');
34
+ expect(text).toContain('Source: MEMORY.md');
35
+ });
36
+ it('formats results without source when source is absent', async () => {
37
+ mockJarvisPost.mockResolvedValueOnce({
38
+ ok: true,
39
+ data: {
40
+ data: {
41
+ results: [{ content: 'A memory without source', relevance: 0.75 }],
42
+ query: 'test',
43
+ method: 'rag',
44
+ },
45
+ status: 'ok',
46
+ },
47
+ });
48
+ const result = await handleMemorySearch('test');
49
+ const text = result.content[0].text;
50
+ expect(text).toContain('[Relevance: 0.75]');
51
+ expect(text).toContain('A memory without source');
52
+ expect(text).not.toContain('Source:');
53
+ });
54
+ it('returns "No memories found" for empty results', async () => {
55
+ mockJarvisPost.mockResolvedValueOnce({
56
+ ok: true,
57
+ data: { data: { results: [], query: 'nothing', method: 'rag' }, status: 'ok' },
58
+ });
59
+ const result = await handleMemorySearch('nothing');
60
+ expect(result.content[0].text).toBe('No memories found matching your query.');
61
+ });
62
+ it('returns "No memories found" when results is undefined', async () => {
63
+ mockJarvisPost.mockResolvedValueOnce({
64
+ ok: true,
65
+ data: { data: { query: 'nothing', method: 'rag' }, status: 'ok' },
66
+ });
67
+ const result = await handleMemorySearch('nothing');
68
+ expect(result.content[0].text).toBe('No memories found matching your query.');
69
+ });
70
+ it('returns error message when server unreachable', async () => {
71
+ mockJarvisPost.mockResolvedValueOnce({
72
+ ok: false,
73
+ error: 'Jarvis server unreachable: ECONNREFUSED',
74
+ });
75
+ const result = await handleMemorySearch('test');
76
+ expect(result.content[0].text).toBe('Jarvis server unreachable: ECONNREFUSED');
77
+ });
78
+ it('returns error message when server returns error', async () => {
79
+ mockJarvisPost.mockResolvedValueOnce({
80
+ ok: false,
81
+ error: 'Server error: MEMU_ERROR - search failed',
82
+ });
83
+ const result = await handleMemorySearch('test');
84
+ expect(result.content[0].text).toBe('Server error: MEMU_ERROR - search failed');
85
+ });
86
+ it('calls jarvisPost with correct path and body', async () => {
87
+ mockJarvisPost.mockResolvedValueOnce({
88
+ ok: true,
89
+ data: { data: { results: [], query: 'test', method: 'rag' }, status: 'ok' },
90
+ });
91
+ await handleMemorySearch('my query');
92
+ expect(mockJarvisPost).toHaveBeenCalledWith('/memory/search', { query: 'my query', method: 'rag' });
93
+ });
94
+ });
95
+ //# sourceMappingURL=memory-search.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-search.test.js","sourceRoot":"","sources":["../../src/__tests__/memory-search.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tools.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/tools.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,52 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { memorySearchSchema, memoryAddSchema } from '../schemas.js';
3
+ describe('memory_search schema', () => {
4
+ it('accepts a valid query string', () => {
5
+ const result = memorySearchSchema.safeParse({ query: 'TypeScript conventions' });
6
+ expect(result.success).toBe(true);
7
+ });
8
+ it('rejects missing query', () => {
9
+ const result = memorySearchSchema.safeParse({});
10
+ expect(result.success).toBe(false);
11
+ });
12
+ it('rejects non-string query', () => {
13
+ const result = memorySearchSchema.safeParse({ query: 42 });
14
+ expect(result.success).toBe(false);
15
+ });
16
+ it('rejects null query', () => {
17
+ const result = memorySearchSchema.safeParse({ query: null });
18
+ expect(result.success).toBe(false);
19
+ });
20
+ });
21
+ describe('memory_add schema', () => {
22
+ it('accepts content with optional context', () => {
23
+ const result = memoryAddSchema.safeParse({
24
+ content: 'Use httpx.AsyncClient for all HTTP calls',
25
+ context: 'Project standard — async-first Python codebase',
26
+ });
27
+ expect(result.success).toBe(true);
28
+ });
29
+ it('accepts content without context', () => {
30
+ const result = memoryAddSchema.safeParse({
31
+ content: 'Use httpx.AsyncClient for all HTTP calls',
32
+ });
33
+ expect(result.success).toBe(true);
34
+ });
35
+ it('rejects missing content', () => {
36
+ const result = memoryAddSchema.safeParse({ context: 'some context' });
37
+ expect(result.success).toBe(false);
38
+ });
39
+ it('rejects non-string content', () => {
40
+ const result = memoryAddSchema.safeParse({ content: 123 });
41
+ expect(result.success).toBe(false);
42
+ });
43
+ it('rejects non-string context when provided', () => {
44
+ const result = memoryAddSchema.safeParse({ content: 'valid', context: 99 });
45
+ expect(result.success).toBe(false);
46
+ });
47
+ it('accepts explicit undefined context', () => {
48
+ const result = memoryAddSchema.safeParse({ content: 'valid', context: undefined });
49
+ expect(result.success).toBe(true);
50
+ });
51
+ });
52
+ //# sourceMappingURL=tools.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.test.js","sourceRoot":"","sources":["../../src/__tests__/tools.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEpE,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,MAAM,GAAG,kBAAkB,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC,CAAC;QACjF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,MAAM,GAAG,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,MAAM,GAAG,kBAAkB,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,MAAM,MAAM,GAAG,kBAAkB,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC;YACvC,OAAO,EAAE,0CAA0C;YACnD,OAAO,EAAE,gDAAgD;SAC1D,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC;YACvC,OAAO,EAAE,0CAA0C;SACpD,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;QACtE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QACnF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -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,15 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { memorySearchSchema, memoryAddSchema } from './schemas.js';
5
+ import { handleMemorySearch } from './tools/memory-search.js';
6
+ import { handleMemoryAdd } from './tools/memory-add.js';
7
+ const server = new McpServer({
8
+ name: 'jarvis-memory',
9
+ version: '0.1.0',
10
+ });
11
+ server.tool('memory_search', 'Search past memories semantically. Returns relevant decisions, preferences, patterns, and facts.', memorySearchSchema.shape, async ({ query }) => handleMemorySearch(query));
12
+ server.tool('memory_add', 'Store a new memory. Use for decisions (with reasoning), preferences, patterns, corrections, or facts.', memoryAddSchema.shape, async ({ content, context }) => handleMemoryAdd(content, context));
13
+ const transport = new StdioServerTransport();
14
+ await server.connect(transport);
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,eAAe;IACrB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,MAAM,CAAC,IAAI,CACT,eAAe,EACf,kGAAkG,EAClG,kBAAkB,CAAC,KAAK,EACxB,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAC/C,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,uGAAuG,EACvG,eAAe,CAAC,KAAK,EACrB,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAClE,CAAC;AAEF,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ export type JarvisResult<T> = {
2
+ ok: true;
3
+ data: T;
4
+ } | {
5
+ ok: false;
6
+ error: string;
7
+ };
8
+ export declare function jarvisGet<T>(path: string): Promise<JarvisResult<T>>;
9
+ export declare function jarvisPost<T>(path: string, body: unknown): Promise<JarvisResult<T>>;
10
+ //# sourceMappingURL=jarvis-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jarvis-client.d.ts","sourceRoot":"","sources":["../../src/lib/jarvis-client.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,CAAC,CAAC,IACtB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,GACrB;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AA6CjC,wBAAsB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAezE;AAED,wBAAsB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAgBzF"}
@@ -0,0 +1,73 @@
1
+ const JARVIS_SERVER_URL = process.env.JARVIS_SERVER_URL ?? 'http://localhost:8000';
2
+ const JARVIS_API_KEY = process.env.JARVIS_API_KEY ?? '';
3
+ const JARVIS_EXTRA_HEADERS_RAW = process.env.JARVIS_EXTRA_HEADERS ?? '';
4
+ function parseExtraHeaders() {
5
+ if (!JARVIS_EXTRA_HEADERS_RAW)
6
+ return {};
7
+ try {
8
+ const parsed = JSON.parse(JARVIS_EXTRA_HEADERS_RAW);
9
+ return typeof parsed === 'object' && parsed !== null ? parsed : {};
10
+ }
11
+ catch {
12
+ return {};
13
+ }
14
+ }
15
+ const EXTRA_HEADERS = parseExtraHeaders();
16
+ function buildHeaders() {
17
+ return {
18
+ 'Content-Type': 'application/json',
19
+ 'Authorization': `Bearer ${JARVIS_API_KEY}`,
20
+ ...EXTRA_HEADERS,
21
+ };
22
+ }
23
+ async function extractErrorMessage(response) {
24
+ try {
25
+ const body = (await response.json());
26
+ if (body.error?.code && body.error?.message) {
27
+ return `Server error: ${body.error.code} - ${body.error.message}`;
28
+ }
29
+ if (body.error?.message) {
30
+ return `Server error: ${body.error.message}`;
31
+ }
32
+ }
33
+ catch {
34
+ // response body not JSON — fall through
35
+ }
36
+ return `Server error: HTTP ${response.status}`;
37
+ }
38
+ export async function jarvisGet(path) {
39
+ try {
40
+ const response = await fetch(`${JARVIS_SERVER_URL}${path}`, {
41
+ method: 'GET',
42
+ headers: buildHeaders(),
43
+ });
44
+ if (!response.ok) {
45
+ return { ok: false, error: await extractErrorMessage(response) };
46
+ }
47
+ const data = (await response.json());
48
+ return { ok: true, data };
49
+ }
50
+ catch (err) {
51
+ const message = err instanceof Error ? err.message : String(err);
52
+ return { ok: false, error: `Jarvis server unreachable: ${message}` };
53
+ }
54
+ }
55
+ export async function jarvisPost(path, body) {
56
+ try {
57
+ const response = await fetch(`${JARVIS_SERVER_URL}${path}`, {
58
+ method: 'POST',
59
+ headers: buildHeaders(),
60
+ body: JSON.stringify(body),
61
+ });
62
+ if (!response.ok) {
63
+ return { ok: false, error: await extractErrorMessage(response) };
64
+ }
65
+ const data = (await response.json());
66
+ return { ok: true, data };
67
+ }
68
+ catch (err) {
69
+ const message = err instanceof Error ? err.message : String(err);
70
+ return { ok: false, error: `Jarvis server unreachable: ${message}` };
71
+ }
72
+ }
73
+ //# sourceMappingURL=jarvis-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jarvis-client.js","sourceRoot":"","sources":["../../src/lib/jarvis-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { z } from 'zod';
2
+ export declare const memorySearchSchema: z.ZodObject<{
3
+ query: z.ZodString;
4
+ }, "strip", z.ZodTypeAny, {
5
+ query: string;
6
+ }, {
7
+ query: string;
8
+ }>;
9
+ export declare const memoryAddSchema: z.ZodObject<{
10
+ content: z.ZodString;
11
+ context: z.ZodOptional<z.ZodString>;
12
+ }, "strip", z.ZodTypeAny, {
13
+ content: string;
14
+ context?: string | undefined;
15
+ }, {
16
+ content: string;
17
+ context?: string | undefined;
18
+ }>;
19
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,kBAAkB;;;;;;EAE7B,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;;;;;EAG1B,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { z } from 'zod';
2
+ export const memorySearchSchema = z.object({
3
+ query: z.string().describe('Search query for past memories'),
4
+ });
5
+ export const memoryAddSchema = z.object({
6
+ content: z.string().describe('Memory content to store'),
7
+ context: z.string().optional().describe('Additional context about when/why this memory matters'),
8
+ });
9
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;CAC7D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IACvD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;CACjG,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function handleMemoryAdd(content: string, context?: string): Promise<{
2
+ content: {
3
+ type: "text";
4
+ text: string;
5
+ }[];
6
+ }>;
7
+ //# sourceMappingURL=memory-add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-add.d.ts","sourceRoot":"","sources":["../../src/tools/memory-add.ts"],"names":[],"mappings":"AAGA,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;;;;;GAStE"}
@@ -0,0 +1,10 @@
1
+ import { jarvisPost } from '../lib/jarvis-client.js';
2
+ export async function handleMemoryAdd(content, context) {
3
+ const result = await jarvisPost('/memory/add', { content, metadata: { context } });
4
+ if (!result.ok) {
5
+ return { content: [{ type: 'text', text: result.error }] };
6
+ }
7
+ const memoryId = result.data.data?.memoryId ?? 'unknown';
8
+ return { content: [{ type: 'text', text: `Memory stored successfully (ID: ${memoryId})` }] };
9
+ }
10
+ //# sourceMappingURL=memory-add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-add.js","sourceRoot":"","sources":["../../src/tools/memory-add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAGrD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAe,EAAE,OAAgB;IACrE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAoB,aAAa,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IAEtG,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;IACtE,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,IAAI,SAAS,CAAC;IACzD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,mCAAmC,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC;AACxG,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function handleMemorySearch(query: string): Promise<{
2
+ content: {
3
+ type: "text";
4
+ text: string;
5
+ }[];
6
+ }>;
7
+ //# sourceMappingURL=memory-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-search.d.ts","sourceRoot":"","sources":["../../src/tools/memory-search.ts"],"names":[],"mappings":"AAWA,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,MAAM;;;;;GAerD"}
@@ -0,0 +1,22 @@
1
+ import { jarvisPost } from '../lib/jarvis-client.js';
2
+ function formatResult(result, index) {
3
+ let line = `${index + 1}. [Relevance: ${result.relevance.toFixed(2)}] ${result.content}`;
4
+ if (result.source) {
5
+ line += `\n Source: ${result.source}`;
6
+ }
7
+ return line;
8
+ }
9
+ export async function handleMemorySearch(query) {
10
+ const result = await jarvisPost('/memory/search', { query, method: 'rag' });
11
+ if (!result.ok) {
12
+ return { content: [{ type: 'text', text: result.error }] };
13
+ }
14
+ const results = result.data.data?.results;
15
+ if (!results || results.length === 0) {
16
+ return { content: [{ type: 'text', text: 'No memories found matching your query.' }] };
17
+ }
18
+ const formatted = results.map(formatResult).join('\n\n');
19
+ const text = `Found ${results.length} memories matching "${query}":\n\n${formatted}`;
20
+ return { content: [{ type: 'text', text }] };
21
+ }
22
+ //# sourceMappingURL=memory-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-search.js","sourceRoot":"","sources":["../../src/tools/memory-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAGrD,SAAS,YAAY,CAAC,MAA0B,EAAE,KAAa;IAC7D,IAAI,IAAI,GAAG,GAAG,KAAK,GAAG,CAAC,iBAAiB,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC;IACzF,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,IAAI,IAAI,gBAAgB,MAAM,CAAC,MAAM,EAAE,CAAC;IAC1C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,KAAa;IACpD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAuB,gBAAgB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAElG,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;IACtE,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC;IAC1C,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,wCAAwC,EAAE,CAAC,EAAE,CAAC;IAClG,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,SAAS,OAAO,CAAC,MAAM,uBAAuB,KAAK,SAAS,SAAS,EAAE,CAAC;IACrF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AACxD,CAAC"}
@@ -0,0 +1,22 @@
1
+ export interface MemorySearchResult {
2
+ content: string;
3
+ relevance: number;
4
+ source?: string;
5
+ metadata?: Record<string, unknown>;
6
+ }
7
+ export interface MemorySearchResponse {
8
+ data: {
9
+ results: MemorySearchResult[];
10
+ query: string;
11
+ method: string;
12
+ };
13
+ status: string;
14
+ }
15
+ export interface MemoryAddResponse {
16
+ data: {
17
+ memoryId: string;
18
+ status: string;
19
+ };
20
+ status: string;
21
+ }
22
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE;QACJ,OAAO,EAAE,kBAAkB,EAAE,CAAC;QAC9B,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,MAAM,EAAE,MAAM,CAAC;CAChB"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@parasite2060/jarvis-mcp-server",
3
+ "version": "0.2.0",
4
+ "description": "Jarvis MCP server providing memory_search and memory_add tools for Claude Code",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "jarvis-mcp-server": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "prepublishOnly": "tsc",
16
+ "test": "vitest run",
17
+ "test:watch": "vitest"
18
+ },
19
+ "publishConfig": {
20
+ "access": "public"
21
+ },
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "https://github.com/parasite2060/jarvis-claude-plugin.git",
25
+ "directory": "mcp-server"
26
+ },
27
+ "dependencies": {
28
+ "@modelcontextprotocol/sdk": "^1.28.0",
29
+ "zod": "^3.25.0"
30
+ },
31
+ "devDependencies": {
32
+ "@types/node": "^25.5.0",
33
+ "typescript": "^5.8.0",
34
+ "vitest": "^3.1.0"
35
+ }
36
+ }